diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java new file mode 100644 index 0000000..cfa238f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java @@ -0,0 +1,94 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class ReportWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + ICommonPermissionService commonPermissionService = SpringContextHolder.getBean(ICommonPermissionService.class); + ICommonPersonService commonPersonService = SpringContextHolder.getBean(ICommonPersonService.class); + + public ReportWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + +// if (!ToolUtil.isEmpty(map.get("remarks"))) { +// String s = map.get("remarks").toString(); +// String[] arr = s.split(";"); +// s = arr[0].substring(arr[0].indexOf(":") + 1); +// if (arr.length > 1) { +// for (int i = 1; i < arr.length; i++) { +// s = s + ";" + arr[i].substring(arr[i].indexOf(":") + 1); +// } +// } +// map.put("remarks", s); +// } + + ShiroUser shiroUser = commonPermissionService .getCurrLoginUser(); + Person person = commonPersonService.getPersonById((Serializable) map.get("personId")); + Map personExt = (Map)person.getExt(); + if (shiroUser.getRoleNames().contains("人事处")) { + String isZhuanwu = Convert.toStr(personExt.get("isZhuanwu")); + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (map.get("deptName").toString().equals("人力资源处") || (isZhuanwu != null && isZhuanwu.equals("1")) || (isLeader != null && isLeader.equals("1"))) { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } else map.put("canEdit", "0"); + } else if (shiroUser.getRoleNames().contains("部门领导")) { + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (isLeader != null && isLeader.equals("1")) { + map.put("canEdit", "0"); + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + + + + } + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java new file mode 100644 index 0000000..cfa238f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java @@ -0,0 +1,94 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class ReportWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + ICommonPermissionService commonPermissionService = SpringContextHolder.getBean(ICommonPermissionService.class); + ICommonPersonService commonPersonService = SpringContextHolder.getBean(ICommonPersonService.class); + + public ReportWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + +// if (!ToolUtil.isEmpty(map.get("remarks"))) { +// String s = map.get("remarks").toString(); +// String[] arr = s.split(";"); +// s = arr[0].substring(arr[0].indexOf(":") + 1); +// if (arr.length > 1) { +// for (int i = 1; i < arr.length; i++) { +// s = s + ";" + arr[i].substring(arr[i].indexOf(":") + 1); +// } +// } +// map.put("remarks", s); +// } + + ShiroUser shiroUser = commonPermissionService .getCurrLoginUser(); + Person person = commonPersonService.getPersonById((Serializable) map.get("personId")); + Map personExt = (Map)person.getExt(); + if (shiroUser.getRoleNames().contains("人事处")) { + String isZhuanwu = Convert.toStr(personExt.get("isZhuanwu")); + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (map.get("deptName").toString().equals("人力资源处") || (isZhuanwu != null && isZhuanwu.equals("1")) || (isLeader != null && isLeader.equals("1"))) { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } else map.put("canEdit", "0"); + } else if (shiroUser.getRoleNames().contains("部门领导")) { + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (isLeader != null && isLeader.equals("1")) { + map.put("canEdit", "0"); + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + + + + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java new file mode 100644 index 0000000..be6157b --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.util.Map; + +/** + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class SpecialDayWarpper extends BaseControllerWarpper { + + public SpecialDayWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + if(!ToolUtil.isEmpty(map.get("isKaoqin"))) { + if(map.get("isKaoqin").equals("1")) map.put("isKaoqinName", "是"); + else map.put("isKaoqinName", "否"); + }else{ + map.put("isKaoqinName", ""); + } + + } + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java new file mode 100644 index 0000000..cfa238f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java @@ -0,0 +1,94 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class ReportWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + ICommonPermissionService commonPermissionService = SpringContextHolder.getBean(ICommonPermissionService.class); + ICommonPersonService commonPersonService = SpringContextHolder.getBean(ICommonPersonService.class); + + public ReportWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + +// if (!ToolUtil.isEmpty(map.get("remarks"))) { +// String s = map.get("remarks").toString(); +// String[] arr = s.split(";"); +// s = arr[0].substring(arr[0].indexOf(":") + 1); +// if (arr.length > 1) { +// for (int i = 1; i < arr.length; i++) { +// s = s + ";" + arr[i].substring(arr[i].indexOf(":") + 1); +// } +// } +// map.put("remarks", s); +// } + + ShiroUser shiroUser = commonPermissionService .getCurrLoginUser(); + Person person = commonPersonService.getPersonById((Serializable) map.get("personId")); + Map personExt = (Map)person.getExt(); + if (shiroUser.getRoleNames().contains("人事处")) { + String isZhuanwu = Convert.toStr(personExt.get("isZhuanwu")); + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (map.get("deptName").toString().equals("人力资源处") || (isZhuanwu != null && isZhuanwu.equals("1")) || (isLeader != null && isLeader.equals("1"))) { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } else map.put("canEdit", "0"); + } else if (shiroUser.getRoleNames().contains("部门领导")) { + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (isLeader != null && isLeader.equals("1")) { + map.put("canEdit", "0"); + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + + + + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java new file mode 100644 index 0000000..be6157b --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.util.Map; + +/** + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class SpecialDayWarpper extends BaseControllerWarpper { + + public SpecialDayWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + if(!ToolUtil.isEmpty(map.get("isKaoqin"))) { + if(map.get("isKaoqin").equals("1")) map.put("isKaoqinName", "是"); + else map.put("isKaoqinName", "否"); + }else{ + map.put("isKaoqinName", ""); + } + + } + +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java index fbb3d51..0940c31 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java @@ -1,9 +1,11 @@ package com.casic.missiles.modular.register.controller; +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ErrorResponseData; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.annotion.BussinessLog; import com.casic.missiles.core.common.constant.Const; @@ -17,23 +19,30 @@ import com.casic.missiles.core.log.LogObjectHolder; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.enums.IrisExportEnum; import com.casic.missiles.modular.register.model.IrisPersonPhoto; import com.casic.missiles.modular.register.service.IIrisDataService; import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; +import com.casic.missiles.modular.register.service.impl.IrisPersonServiceImpl; import com.casic.missiles.modular.register.util.Base64Util; +import com.casic.missiles.modular.register.warpper.IrisPersonWarpper; import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.dto.PersonResDto; import com.casic.missiles.modular.system.model.Person; import com.casic.missiles.service.ICasicFileService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.SocketTimeoutException; import java.util.List; import java.util.Map; @@ -46,6 +55,7 @@ @RestController @RequestMapping("/person") public class IrisPersonController extends ExportController { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonController.class); @Autowired private ICommonPermissionService permissionService; @@ -174,6 +184,7 @@ Page> defaultPage = new PageFactory>().defaultPage(); DataScope scope = permissionService.getCurrUserDataScope(); Page> page = getPersonPage(defaultPage, keywords, sex, duty, deptid, personType, startTime, endTime, scope); + return ResponseData.success(super.packForBT(page)); } @@ -203,6 +214,7 @@ } query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); List> scopePersons = irisPersonService.selectDataScopePersonMap(defaultPage, scope, query); + new IrisPersonWarpper(scopePersons).warp(); defaultPage.setRecords(scopePersons); query.orderBy(PersonConst.TABLE_PERSONCODE); //展示数据封装 @@ -219,4 +231,30 @@ return ResponseData.success(); } } + + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + + try { + //解析文件流 + ResponseData responseData = irisPersonService.parseSourceFile(file); + //校验及保存数据 + return irisPersonService.personImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("人员信息导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } } diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java new file mode 100644 index 0000000..cfa238f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java @@ -0,0 +1,94 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class ReportWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + ICommonPermissionService commonPermissionService = SpringContextHolder.getBean(ICommonPermissionService.class); + ICommonPersonService commonPersonService = SpringContextHolder.getBean(ICommonPersonService.class); + + public ReportWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + +// if (!ToolUtil.isEmpty(map.get("remarks"))) { +// String s = map.get("remarks").toString(); +// String[] arr = s.split(";"); +// s = arr[0].substring(arr[0].indexOf(":") + 1); +// if (arr.length > 1) { +// for (int i = 1; i < arr.length; i++) { +// s = s + ";" + arr[i].substring(arr[i].indexOf(":") + 1); +// } +// } +// map.put("remarks", s); +// } + + ShiroUser shiroUser = commonPermissionService .getCurrLoginUser(); + Person person = commonPersonService.getPersonById((Serializable) map.get("personId")); + Map personExt = (Map)person.getExt(); + if (shiroUser.getRoleNames().contains("人事处")) { + String isZhuanwu = Convert.toStr(personExt.get("isZhuanwu")); + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (map.get("deptName").toString().equals("人力资源处") || (isZhuanwu != null && isZhuanwu.equals("1")) || (isLeader != null && isLeader.equals("1"))) { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } else map.put("canEdit", "0"); + } else if (shiroUser.getRoleNames().contains("部门领导")) { + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (isLeader != null && isLeader.equals("1")) { + map.put("canEdit", "0"); + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + + + + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java new file mode 100644 index 0000000..be6157b --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.util.Map; + +/** + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class SpecialDayWarpper extends BaseControllerWarpper { + + public SpecialDayWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + if(!ToolUtil.isEmpty(map.get("isKaoqin"))) { + if(map.get("isKaoqin").equals("1")) map.put("isKaoqinName", "是"); + else map.put("isKaoqinName", "否"); + }else{ + map.put("isKaoqinName", ""); + } + + } + +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java index fbb3d51..0940c31 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java @@ -1,9 +1,11 @@ package com.casic.missiles.modular.register.controller; +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ErrorResponseData; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.annotion.BussinessLog; import com.casic.missiles.core.common.constant.Const; @@ -17,23 +19,30 @@ import com.casic.missiles.core.log.LogObjectHolder; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.enums.IrisExportEnum; import com.casic.missiles.modular.register.model.IrisPersonPhoto; import com.casic.missiles.modular.register.service.IIrisDataService; import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; +import com.casic.missiles.modular.register.service.impl.IrisPersonServiceImpl; import com.casic.missiles.modular.register.util.Base64Util; +import com.casic.missiles.modular.register.warpper.IrisPersonWarpper; import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.dto.PersonResDto; import com.casic.missiles.modular.system.model.Person; import com.casic.missiles.service.ICasicFileService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.SocketTimeoutException; import java.util.List; import java.util.Map; @@ -46,6 +55,7 @@ @RestController @RequestMapping("/person") public class IrisPersonController extends ExportController { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonController.class); @Autowired private ICommonPermissionService permissionService; @@ -174,6 +184,7 @@ Page> defaultPage = new PageFactory>().defaultPage(); DataScope scope = permissionService.getCurrUserDataScope(); Page> page = getPersonPage(defaultPage, keywords, sex, duty, deptid, personType, startTime, endTime, scope); + return ResponseData.success(super.packForBT(page)); } @@ -203,6 +214,7 @@ } query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); List> scopePersons = irisPersonService.selectDataScopePersonMap(defaultPage, scope, query); + new IrisPersonWarpper(scopePersons).warp(); defaultPage.setRecords(scopePersons); query.orderBy(PersonConst.TABLE_PERSONCODE); //展示数据封装 @@ -219,4 +231,30 @@ return ResponseData.success(); } } + + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + + try { + //解析文件流 + ResponseData responseData = irisPersonService.parseSourceFile(file); + //校验及保存数据 + return irisPersonService.personImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("人员信息导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java new file mode 100644 index 0000000..c2b0114 --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java @@ -0,0 +1,165 @@ +package com.casic.missiles.modular.register.dto; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Person; +import org.apache.shiro.crypto.hash.Hash; +import org.apache.xmlbeans.impl.xb.xsdschema.Public; +import org.springframework.beans.factory.annotation.Autowired; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class PersonAtdDTO { + + private Long id;//主键 + private String name;//开始日期 + private String deptName;//开始时间 + private String idCardNo;//结束日期 + private String isKaoqin;//结束时间 + private String isOt; + private String isZhuanwu;//备注信息 + private String isLeader;//备注类型 + private String initAnnualLeave; + private String annualLeave; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getIdCardNo() { + return idCardNo; + } + + public void setIdCardNo(String idCardNo) { + this.idCardNo = idCardNo; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + public String getIsZhuanwu() { + return isZhuanwu; + } + + public void setIsZhuanwu(String isZhuanwu) { + this.isZhuanwu = isZhuanwu; + } + + public String getIsLeader() { + return isLeader; + } + + public void setIsLeader(String isLeader) { + this.isLeader = isLeader; + } + + public String getInitAnnualLeave() { + return initAnnualLeave; + } + + public void setInitAnnualLeave(String initAnnualLeave) { + this.initAnnualLeave = initAnnualLeave; + } + + public String getAnnualLeave() { + return annualLeave; + } + + public void setAnnualLeave(String annualLeave) { + this.annualLeave = annualLeave; + } + + public String getIsOt() { + return isOt; + } + + public void setIsOt(String isOt) { + this.isOt = isOt; + } + + @Override + public String toString() { + return "PerosnDTO{" + + "id=" + id + + ", name='" + name + '\'' + + ", deptName='" + deptName + '\'' + + ", idCardNo='" + idCardNo + '\'' + + ", isKaoqin='" + isKaoqin + '\'' + + ", isZhuanwu='" + isZhuanwu + '\'' + + ", isLeader='" + isLeader + '\'' + + ", initAnnualLeave='" + initAnnualLeave + '\'' + + ", annualLeave='" + annualLeave + '\'' + + '}'; + } + + public Person toPerson(){ + Person person = new Person(); + try { + person.setName(this.name); + person.setIdCardNo(this.idCardNo); + person.setDelflag("0"); + + Map mapExt = new HashMap<>(); + mapExt.put("initAnnualLeave",this.initAnnualLeave); + mapExt.put("annualLeave",this.annualLeave); + if(this.isKaoqin!=null && !this.isKaoqin.equals("") && this.isKaoqin.equals("否")) + {mapExt.put("isKaoqin","0");}else mapExt.put("isKaoqin","1"); + + if(this.isOt!=null && !this.isOt.equals("") && this.isOt.equals("是")) + {mapExt.put("isOt","1");}else mapExt.put("isOt","0"); + + if(this.isZhuanwu!=null && !this.isZhuanwu.equals("") && this.isZhuanwu.equals("是")) + {mapExt.put("isZhuanwu","1");}else mapExt.put("isZhuanwu","0"); + + if(this.isLeader!=null && !this.isLeader.equals("") && this.isLeader.equals("是")) + {mapExt.put("isLeader","1");}else mapExt.put("isLeader","0"); + + person.setExt(mapExt); + + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + return person; + } +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java new file mode 100644 index 0000000..cfa238f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java @@ -0,0 +1,94 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class ReportWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + ICommonPermissionService commonPermissionService = SpringContextHolder.getBean(ICommonPermissionService.class); + ICommonPersonService commonPersonService = SpringContextHolder.getBean(ICommonPersonService.class); + + public ReportWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + +// if (!ToolUtil.isEmpty(map.get("remarks"))) { +// String s = map.get("remarks").toString(); +// String[] arr = s.split(";"); +// s = arr[0].substring(arr[0].indexOf(":") + 1); +// if (arr.length > 1) { +// for (int i = 1; i < arr.length; i++) { +// s = s + ";" + arr[i].substring(arr[i].indexOf(":") + 1); +// } +// } +// map.put("remarks", s); +// } + + ShiroUser shiroUser = commonPermissionService .getCurrLoginUser(); + Person person = commonPersonService.getPersonById((Serializable) map.get("personId")); + Map personExt = (Map)person.getExt(); + if (shiroUser.getRoleNames().contains("人事处")) { + String isZhuanwu = Convert.toStr(personExt.get("isZhuanwu")); + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (map.get("deptName").toString().equals("人力资源处") || (isZhuanwu != null && isZhuanwu.equals("1")) || (isLeader != null && isLeader.equals("1"))) { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } else map.put("canEdit", "0"); + } else if (shiroUser.getRoleNames().contains("部门领导")) { + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (isLeader != null && isLeader.equals("1")) { + map.put("canEdit", "0"); + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + + + + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java new file mode 100644 index 0000000..be6157b --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.util.Map; + +/** + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class SpecialDayWarpper extends BaseControllerWarpper { + + public SpecialDayWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + if(!ToolUtil.isEmpty(map.get("isKaoqin"))) { + if(map.get("isKaoqin").equals("1")) map.put("isKaoqinName", "是"); + else map.put("isKaoqinName", "否"); + }else{ + map.put("isKaoqinName", ""); + } + + } + +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java index fbb3d51..0940c31 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java @@ -1,9 +1,11 @@ package com.casic.missiles.modular.register.controller; +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ErrorResponseData; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.annotion.BussinessLog; import com.casic.missiles.core.common.constant.Const; @@ -17,23 +19,30 @@ import com.casic.missiles.core.log.LogObjectHolder; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.enums.IrisExportEnum; import com.casic.missiles.modular.register.model.IrisPersonPhoto; import com.casic.missiles.modular.register.service.IIrisDataService; import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; +import com.casic.missiles.modular.register.service.impl.IrisPersonServiceImpl; import com.casic.missiles.modular.register.util.Base64Util; +import com.casic.missiles.modular.register.warpper.IrisPersonWarpper; import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.dto.PersonResDto; import com.casic.missiles.modular.system.model.Person; import com.casic.missiles.service.ICasicFileService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.SocketTimeoutException; import java.util.List; import java.util.Map; @@ -46,6 +55,7 @@ @RestController @RequestMapping("/person") public class IrisPersonController extends ExportController { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonController.class); @Autowired private ICommonPermissionService permissionService; @@ -174,6 +184,7 @@ Page> defaultPage = new PageFactory>().defaultPage(); DataScope scope = permissionService.getCurrUserDataScope(); Page> page = getPersonPage(defaultPage, keywords, sex, duty, deptid, personType, startTime, endTime, scope); + return ResponseData.success(super.packForBT(page)); } @@ -203,6 +214,7 @@ } query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); List> scopePersons = irisPersonService.selectDataScopePersonMap(defaultPage, scope, query); + new IrisPersonWarpper(scopePersons).warp(); defaultPage.setRecords(scopePersons); query.orderBy(PersonConst.TABLE_PERSONCODE); //展示数据封装 @@ -219,4 +231,30 @@ return ResponseData.success(); } } + + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + + try { + //解析文件流 + ResponseData responseData = irisPersonService.parseSourceFile(file); + //校验及保存数据 + return irisPersonService.personImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("人员信息导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java new file mode 100644 index 0000000..c2b0114 --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java @@ -0,0 +1,165 @@ +package com.casic.missiles.modular.register.dto; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Person; +import org.apache.shiro.crypto.hash.Hash; +import org.apache.xmlbeans.impl.xb.xsdschema.Public; +import org.springframework.beans.factory.annotation.Autowired; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class PersonAtdDTO { + + private Long id;//主键 + private String name;//开始日期 + private String deptName;//开始时间 + private String idCardNo;//结束日期 + private String isKaoqin;//结束时间 + private String isOt; + private String isZhuanwu;//备注信息 + private String isLeader;//备注类型 + private String initAnnualLeave; + private String annualLeave; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getIdCardNo() { + return idCardNo; + } + + public void setIdCardNo(String idCardNo) { + this.idCardNo = idCardNo; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + public String getIsZhuanwu() { + return isZhuanwu; + } + + public void setIsZhuanwu(String isZhuanwu) { + this.isZhuanwu = isZhuanwu; + } + + public String getIsLeader() { + return isLeader; + } + + public void setIsLeader(String isLeader) { + this.isLeader = isLeader; + } + + public String getInitAnnualLeave() { + return initAnnualLeave; + } + + public void setInitAnnualLeave(String initAnnualLeave) { + this.initAnnualLeave = initAnnualLeave; + } + + public String getAnnualLeave() { + return annualLeave; + } + + public void setAnnualLeave(String annualLeave) { + this.annualLeave = annualLeave; + } + + public String getIsOt() { + return isOt; + } + + public void setIsOt(String isOt) { + this.isOt = isOt; + } + + @Override + public String toString() { + return "PerosnDTO{" + + "id=" + id + + ", name='" + name + '\'' + + ", deptName='" + deptName + '\'' + + ", idCardNo='" + idCardNo + '\'' + + ", isKaoqin='" + isKaoqin + '\'' + + ", isZhuanwu='" + isZhuanwu + '\'' + + ", isLeader='" + isLeader + '\'' + + ", initAnnualLeave='" + initAnnualLeave + '\'' + + ", annualLeave='" + annualLeave + '\'' + + '}'; + } + + public Person toPerson(){ + Person person = new Person(); + try { + person.setName(this.name); + person.setIdCardNo(this.idCardNo); + person.setDelflag("0"); + + Map mapExt = new HashMap<>(); + mapExt.put("initAnnualLeave",this.initAnnualLeave); + mapExt.put("annualLeave",this.annualLeave); + if(this.isKaoqin!=null && !this.isKaoqin.equals("") && this.isKaoqin.equals("否")) + {mapExt.put("isKaoqin","0");}else mapExt.put("isKaoqin","1"); + + if(this.isOt!=null && !this.isOt.equals("") && this.isOt.equals("是")) + {mapExt.put("isOt","1");}else mapExt.put("isOt","0"); + + if(this.isZhuanwu!=null && !this.isZhuanwu.equals("") && this.isZhuanwu.equals("是")) + {mapExt.put("isZhuanwu","1");}else mapExt.put("isZhuanwu","0"); + + if(this.isLeader!=null && !this.isLeader.equals("") && this.isLeader.equals("是")) + {mapExt.put("isLeader","1");}else mapExt.put("isLeader","0"); + + person.setExt(mapExt); + + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + return person; + } +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java index 68b16a8..1c9226b 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java @@ -3,10 +3,14 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.model.IrisData; +import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.model.Person; import org.apache.ibatis.annotations.Param; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -29,4 +33,17 @@ void insert(Person person); void update(Person person); + + /** + * 特殊考勤日数据导入 + * @param list 专题库集合 + */ + ResponseData personImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; } diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java new file mode 100644 index 0000000..cfa238f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java @@ -0,0 +1,94 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class ReportWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + ICommonPermissionService commonPermissionService = SpringContextHolder.getBean(ICommonPermissionService.class); + ICommonPersonService commonPersonService = SpringContextHolder.getBean(ICommonPersonService.class); + + public ReportWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + +// if (!ToolUtil.isEmpty(map.get("remarks"))) { +// String s = map.get("remarks").toString(); +// String[] arr = s.split(";"); +// s = arr[0].substring(arr[0].indexOf(":") + 1); +// if (arr.length > 1) { +// for (int i = 1; i < arr.length; i++) { +// s = s + ";" + arr[i].substring(arr[i].indexOf(":") + 1); +// } +// } +// map.put("remarks", s); +// } + + ShiroUser shiroUser = commonPermissionService .getCurrLoginUser(); + Person person = commonPersonService.getPersonById((Serializable) map.get("personId")); + Map personExt = (Map)person.getExt(); + if (shiroUser.getRoleNames().contains("人事处")) { + String isZhuanwu = Convert.toStr(personExt.get("isZhuanwu")); + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (map.get("deptName").toString().equals("人力资源处") || (isZhuanwu != null && isZhuanwu.equals("1")) || (isLeader != null && isLeader.equals("1"))) { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } else map.put("canEdit", "0"); + } else if (shiroUser.getRoleNames().contains("部门领导")) { + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (isLeader != null && isLeader.equals("1")) { + map.put("canEdit", "0"); + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + + + + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java new file mode 100644 index 0000000..be6157b --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.util.Map; + +/** + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class SpecialDayWarpper extends BaseControllerWarpper { + + public SpecialDayWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + if(!ToolUtil.isEmpty(map.get("isKaoqin"))) { + if(map.get("isKaoqin").equals("1")) map.put("isKaoqinName", "是"); + else map.put("isKaoqinName", "否"); + }else{ + map.put("isKaoqinName", ""); + } + + } + +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java index fbb3d51..0940c31 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java @@ -1,9 +1,11 @@ package com.casic.missiles.modular.register.controller; +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ErrorResponseData; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.annotion.BussinessLog; import com.casic.missiles.core.common.constant.Const; @@ -17,23 +19,30 @@ import com.casic.missiles.core.log.LogObjectHolder; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.enums.IrisExportEnum; import com.casic.missiles.modular.register.model.IrisPersonPhoto; import com.casic.missiles.modular.register.service.IIrisDataService; import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; +import com.casic.missiles.modular.register.service.impl.IrisPersonServiceImpl; import com.casic.missiles.modular.register.util.Base64Util; +import com.casic.missiles.modular.register.warpper.IrisPersonWarpper; import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.dto.PersonResDto; import com.casic.missiles.modular.system.model.Person; import com.casic.missiles.service.ICasicFileService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.SocketTimeoutException; import java.util.List; import java.util.Map; @@ -46,6 +55,7 @@ @RestController @RequestMapping("/person") public class IrisPersonController extends ExportController { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonController.class); @Autowired private ICommonPermissionService permissionService; @@ -174,6 +184,7 @@ Page> defaultPage = new PageFactory>().defaultPage(); DataScope scope = permissionService.getCurrUserDataScope(); Page> page = getPersonPage(defaultPage, keywords, sex, duty, deptid, personType, startTime, endTime, scope); + return ResponseData.success(super.packForBT(page)); } @@ -203,6 +214,7 @@ } query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); List> scopePersons = irisPersonService.selectDataScopePersonMap(defaultPage, scope, query); + new IrisPersonWarpper(scopePersons).warp(); defaultPage.setRecords(scopePersons); query.orderBy(PersonConst.TABLE_PERSONCODE); //展示数据封装 @@ -219,4 +231,30 @@ return ResponseData.success(); } } + + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + + try { + //解析文件流 + ResponseData responseData = irisPersonService.parseSourceFile(file); + //校验及保存数据 + return irisPersonService.personImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("人员信息导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java new file mode 100644 index 0000000..c2b0114 --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java @@ -0,0 +1,165 @@ +package com.casic.missiles.modular.register.dto; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Person; +import org.apache.shiro.crypto.hash.Hash; +import org.apache.xmlbeans.impl.xb.xsdschema.Public; +import org.springframework.beans.factory.annotation.Autowired; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class PersonAtdDTO { + + private Long id;//主键 + private String name;//开始日期 + private String deptName;//开始时间 + private String idCardNo;//结束日期 + private String isKaoqin;//结束时间 + private String isOt; + private String isZhuanwu;//备注信息 + private String isLeader;//备注类型 + private String initAnnualLeave; + private String annualLeave; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getIdCardNo() { + return idCardNo; + } + + public void setIdCardNo(String idCardNo) { + this.idCardNo = idCardNo; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + public String getIsZhuanwu() { + return isZhuanwu; + } + + public void setIsZhuanwu(String isZhuanwu) { + this.isZhuanwu = isZhuanwu; + } + + public String getIsLeader() { + return isLeader; + } + + public void setIsLeader(String isLeader) { + this.isLeader = isLeader; + } + + public String getInitAnnualLeave() { + return initAnnualLeave; + } + + public void setInitAnnualLeave(String initAnnualLeave) { + this.initAnnualLeave = initAnnualLeave; + } + + public String getAnnualLeave() { + return annualLeave; + } + + public void setAnnualLeave(String annualLeave) { + this.annualLeave = annualLeave; + } + + public String getIsOt() { + return isOt; + } + + public void setIsOt(String isOt) { + this.isOt = isOt; + } + + @Override + public String toString() { + return "PerosnDTO{" + + "id=" + id + + ", name='" + name + '\'' + + ", deptName='" + deptName + '\'' + + ", idCardNo='" + idCardNo + '\'' + + ", isKaoqin='" + isKaoqin + '\'' + + ", isZhuanwu='" + isZhuanwu + '\'' + + ", isLeader='" + isLeader + '\'' + + ", initAnnualLeave='" + initAnnualLeave + '\'' + + ", annualLeave='" + annualLeave + '\'' + + '}'; + } + + public Person toPerson(){ + Person person = new Person(); + try { + person.setName(this.name); + person.setIdCardNo(this.idCardNo); + person.setDelflag("0"); + + Map mapExt = new HashMap<>(); + mapExt.put("initAnnualLeave",this.initAnnualLeave); + mapExt.put("annualLeave",this.annualLeave); + if(this.isKaoqin!=null && !this.isKaoqin.equals("") && this.isKaoqin.equals("否")) + {mapExt.put("isKaoqin","0");}else mapExt.put("isKaoqin","1"); + + if(this.isOt!=null && !this.isOt.equals("") && this.isOt.equals("是")) + {mapExt.put("isOt","1");}else mapExt.put("isOt","0"); + + if(this.isZhuanwu!=null && !this.isZhuanwu.equals("") && this.isZhuanwu.equals("是")) + {mapExt.put("isZhuanwu","1");}else mapExt.put("isZhuanwu","0"); + + if(this.isLeader!=null && !this.isLeader.equals("") && this.isLeader.equals("是")) + {mapExt.put("isLeader","1");}else mapExt.put("isLeader","0"); + + person.setExt(mapExt); + + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + return person; + } +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java index 68b16a8..1c9226b 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java @@ -3,10 +3,14 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.model.IrisData; +import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.model.Person; import org.apache.ibatis.annotations.Param; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -29,4 +33,17 @@ void insert(Person person); void update(Person person); + + /** + * 特殊考勤日数据导入 + * @param list 专题库集合 + */ + ResponseData personImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java index d936cc2..1a411ca 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java @@ -2,33 +2,61 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.constant.Const; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.common.service.ICommonPersonService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.exception.GunsException; import com.casic.missiles.core.meta.annotations.MetaDataBean; +import com.casic.missiles.core.util.Convert; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; import com.casic.missiles.modular.register.constant.IrisPersonConst; import com.casic.missiles.modular.register.dao.IrisDataMapper; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; +import com.casic.missiles.modular.register.enums.PersonTypeEnums; import com.casic.missiles.modular.register.service.IIrisDataService; +import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; import com.casic.missiles.modular.system.dto.PersonDto; +import com.casic.missiles.modular.system.model.Dept; import com.casic.missiles.modular.system.model.Person; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.hswebframework.expands.office.excel.ExcelIO; +import java.io.InputStream; import java.io.Serializable; +import java.sql.Date; import java.sql.Timestamp; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Service public class IrisPersonServiceImpl implements IIrisPersonService { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonServiceImpl.class); + protected static final Map mapperExcel = new HashMap<>(); + static { + mapperExcel.put("姓名", "name"); + mapperExcel.put("部门", "deptName"); + mapperExcel.put("身份证号", "idCardNo"); + mapperExcel.put("是否考勤(默认是)", "isKaoqin"); + mapperExcel.put("是否统计加班(默认否)", "isOt"); + mapperExcel.put("是否专务(默认否)", "isZhuanwu"); + mapperExcel.put("是否正职领导(默认否)", "isLeader"); + mapperExcel.put("年假(天)", "initAnnualLeave"); + mapperExcel.put("剩余年假(天)","annualLeave"); + } + @Value("${casic.base.personPrefix:}") private String personPrefix; @Autowired @@ -41,6 +69,11 @@ private IMetadataSupportService supportService; @Autowired private IIrisDataService irisDataService; + @Autowired + private IIrisPersonService irisPersonService; + @Autowired + private ICommonDeptService commonDeptService; + @Transactional(rollbackFor = Exception.class) @Override @@ -108,6 +141,116 @@ personService.updatePerson(person); } + + /** + * 员工导入 + * + * @param list 员工集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData personImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + List personList = new ArrayList<>(); + List deptList = commonDeptService.getDeptByTips(null); + Person person = new Person(); + //处理人员信息 + int index = 2; + try { + for (PersonAtdDTO personDto : list) { + person = new Person(); + + // 判断部门信息 + if (ToolUtil.isEmpty(personDto.getDeptName())) { + results.add("第" + index + "行,部门不能为空"); + break; + }else { + for (Dept dept : deptList) { + if (personDto.getDeptName().equals(dept.getSimplename())){ + person.setDeptid(dept.getId()); + break; + } + } + if(ToolUtil.isEmpty(person.getDeptid())){ + results.add("第" + index + "行,部门信息不正确"); + break; + } + } + + if (ToolUtil.isEmpty(personDto.getName())) { + results.add("第" + index + "行,姓名不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getIdCardNo())) { + results.add("第" + index + "行,身份证号不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getInitAnnualLeave())) { + results.add("第" + index + "行,年假天数不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getAnnualLeave())) { + results.add("第" + index + "行,剩余年假天数不能为空"); + break; + } else { + Long deptid = person.getDeptid(); + person = personDto.toPerson(); + person.setDeptid(deptid); + person.setPersonType(PersonTypeEnums.STAFF.getValue()); + person.setOprationId(permissionService.getCurrLoginUser().getId()); + // 根据身份证号得到生日和性别 + String idCardNo = personDto.getIdCardNo(); + String birth = ""; + if (idCardNo.length() == 15) birth = "19" + idCardNo.substring(6, 8)+"-"+idCardNo.substring(8,10)+"-"+idCardNo.substring(10,12); + else if (idCardNo.length() == 18) + { + birth = idCardNo.substring(6, 10)+"-"+idCardNo.substring(10,12)+"-"+idCardNo.substring(12,14); + if ((Convert.toInt(idCardNo.substring(16, 17)) % 2) == 1)//奇数 + { + person.setSex("1"); + } + else person.setSex("2"); + } + person.setBirthday(Date.valueOf(birth)); + + irisPersonService.insert(person); + } + index++; + } + } catch(DuplicateKeyException e){ + e.printStackTrace(); + GunsException gunsException = new GunsException(BizExceptionEnum.SERVER_ERROR); + gunsException.setMessage(e.getMessage().contains("ID_CARD_INDEX") ? "身份证号重复" : "人员编码重复"); + throw gunsException; + } + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List personDtoList = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapperExcel, PersonAtdDTO.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + PersonAtdDTO personDto = row.getResult(); + personDtoList.add(personDto); + } + } else { + //其他sheet停止读取 + logger.info("人员信息导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(personDtoList); + } + private void wrap(Map map) { map.put("deptName", permissionService.getDeptName((Serializable) map.get("deptid"))); if (ToolUtil.isNotEmpty(map.get(IrisPersonConst.PERSON_SEX_KEY))) { diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java new file mode 100644 index 0000000..cfa238f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java @@ -0,0 +1,94 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class ReportWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + ICommonPermissionService commonPermissionService = SpringContextHolder.getBean(ICommonPermissionService.class); + ICommonPersonService commonPersonService = SpringContextHolder.getBean(ICommonPersonService.class); + + public ReportWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + +// if (!ToolUtil.isEmpty(map.get("remarks"))) { +// String s = map.get("remarks").toString(); +// String[] arr = s.split(";"); +// s = arr[0].substring(arr[0].indexOf(":") + 1); +// if (arr.length > 1) { +// for (int i = 1; i < arr.length; i++) { +// s = s + ";" + arr[i].substring(arr[i].indexOf(":") + 1); +// } +// } +// map.put("remarks", s); +// } + + ShiroUser shiroUser = commonPermissionService .getCurrLoginUser(); + Person person = commonPersonService.getPersonById((Serializable) map.get("personId")); + Map personExt = (Map)person.getExt(); + if (shiroUser.getRoleNames().contains("人事处")) { + String isZhuanwu = Convert.toStr(personExt.get("isZhuanwu")); + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (map.get("deptName").toString().equals("人力资源处") || (isZhuanwu != null && isZhuanwu.equals("1")) || (isLeader != null && isLeader.equals("1"))) { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } else map.put("canEdit", "0"); + } else if (shiroUser.getRoleNames().contains("部门领导")) { + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (isLeader != null && isLeader.equals("1")) { + map.put("canEdit", "0"); + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + + + + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java new file mode 100644 index 0000000..be6157b --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.util.Map; + +/** + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class SpecialDayWarpper extends BaseControllerWarpper { + + public SpecialDayWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + if(!ToolUtil.isEmpty(map.get("isKaoqin"))) { + if(map.get("isKaoqin").equals("1")) map.put("isKaoqinName", "是"); + else map.put("isKaoqinName", "否"); + }else{ + map.put("isKaoqinName", ""); + } + + } + +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java index fbb3d51..0940c31 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java @@ -1,9 +1,11 @@ package com.casic.missiles.modular.register.controller; +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ErrorResponseData; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.annotion.BussinessLog; import com.casic.missiles.core.common.constant.Const; @@ -17,23 +19,30 @@ import com.casic.missiles.core.log.LogObjectHolder; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.enums.IrisExportEnum; import com.casic.missiles.modular.register.model.IrisPersonPhoto; import com.casic.missiles.modular.register.service.IIrisDataService; import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; +import com.casic.missiles.modular.register.service.impl.IrisPersonServiceImpl; import com.casic.missiles.modular.register.util.Base64Util; +import com.casic.missiles.modular.register.warpper.IrisPersonWarpper; import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.dto.PersonResDto; import com.casic.missiles.modular.system.model.Person; import com.casic.missiles.service.ICasicFileService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.SocketTimeoutException; import java.util.List; import java.util.Map; @@ -46,6 +55,7 @@ @RestController @RequestMapping("/person") public class IrisPersonController extends ExportController { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonController.class); @Autowired private ICommonPermissionService permissionService; @@ -174,6 +184,7 @@ Page> defaultPage = new PageFactory>().defaultPage(); DataScope scope = permissionService.getCurrUserDataScope(); Page> page = getPersonPage(defaultPage, keywords, sex, duty, deptid, personType, startTime, endTime, scope); + return ResponseData.success(super.packForBT(page)); } @@ -203,6 +214,7 @@ } query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); List> scopePersons = irisPersonService.selectDataScopePersonMap(defaultPage, scope, query); + new IrisPersonWarpper(scopePersons).warp(); defaultPage.setRecords(scopePersons); query.orderBy(PersonConst.TABLE_PERSONCODE); //展示数据封装 @@ -219,4 +231,30 @@ return ResponseData.success(); } } + + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + + try { + //解析文件流 + ResponseData responseData = irisPersonService.parseSourceFile(file); + //校验及保存数据 + return irisPersonService.personImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("人员信息导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java new file mode 100644 index 0000000..c2b0114 --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java @@ -0,0 +1,165 @@ +package com.casic.missiles.modular.register.dto; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Person; +import org.apache.shiro.crypto.hash.Hash; +import org.apache.xmlbeans.impl.xb.xsdschema.Public; +import org.springframework.beans.factory.annotation.Autowired; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class PersonAtdDTO { + + private Long id;//主键 + private String name;//开始日期 + private String deptName;//开始时间 + private String idCardNo;//结束日期 + private String isKaoqin;//结束时间 + private String isOt; + private String isZhuanwu;//备注信息 + private String isLeader;//备注类型 + private String initAnnualLeave; + private String annualLeave; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getIdCardNo() { + return idCardNo; + } + + public void setIdCardNo(String idCardNo) { + this.idCardNo = idCardNo; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + public String getIsZhuanwu() { + return isZhuanwu; + } + + public void setIsZhuanwu(String isZhuanwu) { + this.isZhuanwu = isZhuanwu; + } + + public String getIsLeader() { + return isLeader; + } + + public void setIsLeader(String isLeader) { + this.isLeader = isLeader; + } + + public String getInitAnnualLeave() { + return initAnnualLeave; + } + + public void setInitAnnualLeave(String initAnnualLeave) { + this.initAnnualLeave = initAnnualLeave; + } + + public String getAnnualLeave() { + return annualLeave; + } + + public void setAnnualLeave(String annualLeave) { + this.annualLeave = annualLeave; + } + + public String getIsOt() { + return isOt; + } + + public void setIsOt(String isOt) { + this.isOt = isOt; + } + + @Override + public String toString() { + return "PerosnDTO{" + + "id=" + id + + ", name='" + name + '\'' + + ", deptName='" + deptName + '\'' + + ", idCardNo='" + idCardNo + '\'' + + ", isKaoqin='" + isKaoqin + '\'' + + ", isZhuanwu='" + isZhuanwu + '\'' + + ", isLeader='" + isLeader + '\'' + + ", initAnnualLeave='" + initAnnualLeave + '\'' + + ", annualLeave='" + annualLeave + '\'' + + '}'; + } + + public Person toPerson(){ + Person person = new Person(); + try { + person.setName(this.name); + person.setIdCardNo(this.idCardNo); + person.setDelflag("0"); + + Map mapExt = new HashMap<>(); + mapExt.put("initAnnualLeave",this.initAnnualLeave); + mapExt.put("annualLeave",this.annualLeave); + if(this.isKaoqin!=null && !this.isKaoqin.equals("") && this.isKaoqin.equals("否")) + {mapExt.put("isKaoqin","0");}else mapExt.put("isKaoqin","1"); + + if(this.isOt!=null && !this.isOt.equals("") && this.isOt.equals("是")) + {mapExt.put("isOt","1");}else mapExt.put("isOt","0"); + + if(this.isZhuanwu!=null && !this.isZhuanwu.equals("") && this.isZhuanwu.equals("是")) + {mapExt.put("isZhuanwu","1");}else mapExt.put("isZhuanwu","0"); + + if(this.isLeader!=null && !this.isLeader.equals("") && this.isLeader.equals("是")) + {mapExt.put("isLeader","1");}else mapExt.put("isLeader","0"); + + person.setExt(mapExt); + + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + return person; + } +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java index 68b16a8..1c9226b 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java @@ -3,10 +3,14 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.model.IrisData; +import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.model.Person; import org.apache.ibatis.annotations.Param; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -29,4 +33,17 @@ void insert(Person person); void update(Person person); + + /** + * 特殊考勤日数据导入 + * @param list 专题库集合 + */ + ResponseData personImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java index d936cc2..1a411ca 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java @@ -2,33 +2,61 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.constant.Const; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.common.service.ICommonPersonService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.exception.GunsException; import com.casic.missiles.core.meta.annotations.MetaDataBean; +import com.casic.missiles.core.util.Convert; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; import com.casic.missiles.modular.register.constant.IrisPersonConst; import com.casic.missiles.modular.register.dao.IrisDataMapper; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; +import com.casic.missiles.modular.register.enums.PersonTypeEnums; import com.casic.missiles.modular.register.service.IIrisDataService; +import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; import com.casic.missiles.modular.system.dto.PersonDto; +import com.casic.missiles.modular.system.model.Dept; import com.casic.missiles.modular.system.model.Person; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.hswebframework.expands.office.excel.ExcelIO; +import java.io.InputStream; import java.io.Serializable; +import java.sql.Date; import java.sql.Timestamp; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Service public class IrisPersonServiceImpl implements IIrisPersonService { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonServiceImpl.class); + protected static final Map mapperExcel = new HashMap<>(); + static { + mapperExcel.put("姓名", "name"); + mapperExcel.put("部门", "deptName"); + mapperExcel.put("身份证号", "idCardNo"); + mapperExcel.put("是否考勤(默认是)", "isKaoqin"); + mapperExcel.put("是否统计加班(默认否)", "isOt"); + mapperExcel.put("是否专务(默认否)", "isZhuanwu"); + mapperExcel.put("是否正职领导(默认否)", "isLeader"); + mapperExcel.put("年假(天)", "initAnnualLeave"); + mapperExcel.put("剩余年假(天)","annualLeave"); + } + @Value("${casic.base.personPrefix:}") private String personPrefix; @Autowired @@ -41,6 +69,11 @@ private IMetadataSupportService supportService; @Autowired private IIrisDataService irisDataService; + @Autowired + private IIrisPersonService irisPersonService; + @Autowired + private ICommonDeptService commonDeptService; + @Transactional(rollbackFor = Exception.class) @Override @@ -108,6 +141,116 @@ personService.updatePerson(person); } + + /** + * 员工导入 + * + * @param list 员工集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData personImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + List personList = new ArrayList<>(); + List deptList = commonDeptService.getDeptByTips(null); + Person person = new Person(); + //处理人员信息 + int index = 2; + try { + for (PersonAtdDTO personDto : list) { + person = new Person(); + + // 判断部门信息 + if (ToolUtil.isEmpty(personDto.getDeptName())) { + results.add("第" + index + "行,部门不能为空"); + break; + }else { + for (Dept dept : deptList) { + if (personDto.getDeptName().equals(dept.getSimplename())){ + person.setDeptid(dept.getId()); + break; + } + } + if(ToolUtil.isEmpty(person.getDeptid())){ + results.add("第" + index + "行,部门信息不正确"); + break; + } + } + + if (ToolUtil.isEmpty(personDto.getName())) { + results.add("第" + index + "行,姓名不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getIdCardNo())) { + results.add("第" + index + "行,身份证号不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getInitAnnualLeave())) { + results.add("第" + index + "行,年假天数不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getAnnualLeave())) { + results.add("第" + index + "行,剩余年假天数不能为空"); + break; + } else { + Long deptid = person.getDeptid(); + person = personDto.toPerson(); + person.setDeptid(deptid); + person.setPersonType(PersonTypeEnums.STAFF.getValue()); + person.setOprationId(permissionService.getCurrLoginUser().getId()); + // 根据身份证号得到生日和性别 + String idCardNo = personDto.getIdCardNo(); + String birth = ""; + if (idCardNo.length() == 15) birth = "19" + idCardNo.substring(6, 8)+"-"+idCardNo.substring(8,10)+"-"+idCardNo.substring(10,12); + else if (idCardNo.length() == 18) + { + birth = idCardNo.substring(6, 10)+"-"+idCardNo.substring(10,12)+"-"+idCardNo.substring(12,14); + if ((Convert.toInt(idCardNo.substring(16, 17)) % 2) == 1)//奇数 + { + person.setSex("1"); + } + else person.setSex("2"); + } + person.setBirthday(Date.valueOf(birth)); + + irisPersonService.insert(person); + } + index++; + } + } catch(DuplicateKeyException e){ + e.printStackTrace(); + GunsException gunsException = new GunsException(BizExceptionEnum.SERVER_ERROR); + gunsException.setMessage(e.getMessage().contains("ID_CARD_INDEX") ? "身份证号重复" : "人员编码重复"); + throw gunsException; + } + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List personDtoList = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapperExcel, PersonAtdDTO.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + PersonAtdDTO personDto = row.getResult(); + personDtoList.add(personDto); + } + } else { + //其他sheet停止读取 + logger.info("人员信息导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(personDtoList); + } + private void wrap(Map map) { map.put("deptName", permissionService.getDeptName((Serializable) map.get("deptid"))); if (ToolUtil.isNotEmpty(map.get(IrisPersonConst.PERSON_SEX_KEY))) { diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java new file mode 100644 index 0000000..a39eb1e --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java @@ -0,0 +1,68 @@ +package com.casic.missiles.modular.register.warpper; + + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import org.springframework.beans.factory.annotation.Value; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 人员的包装类 + * + * @date 2019年12月5日10:59:02 + */ +public class IrisPersonWarpper extends BaseControllerWarpper { + + + public IrisPersonWarpper(Object list) { + super(list); + } + ICommonPermissionService service = SpringContextHolder.getBean(ICommonPermissionService.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + @Override + public void warpTheMap(Map map) { + + Map mapExt = (Map)map.get("ext"); + //是否考勤 + if (!ToolUtil.isEmpty(mapExt.get("isKaoqin"))) { + if(mapExt.get("isKaoqin").equals("1")) { + map.put("isKaoqinName", "是"); + }else { + map.put("isKaoqinName", "否"); + } + } + //是否统计加班 + if (!ToolUtil.isEmpty(mapExt.get("isOt"))) { + if(mapExt.get("isOt").equals("1")) { + map.put("isOtName", "是"); + }else { + map.put("isOtName", "否"); + } + } + //是否专务 + if (!ToolUtil.isEmpty(mapExt.get("isZhuanwu"))) { + if(mapExt.get("isZhuanwu").equals("1")) { + map.put("isZhuanwuName", "是"); + }else { + map.put("isZhuanwuName", "否"); + } + } + //是否正职领导 + if (!ToolUtil.isEmpty(mapExt.get("isLeader"))) { + if(mapExt.get("isLeader").equals("1")) { + map.put("isLeaderName", "是"); + }else { + map.put("isLeaderName", "否"); + } + } + + + + } + +} diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java new file mode 100644 index 0000000..cfa238f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java @@ -0,0 +1,94 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class ReportWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + ICommonPermissionService commonPermissionService = SpringContextHolder.getBean(ICommonPermissionService.class); + ICommonPersonService commonPersonService = SpringContextHolder.getBean(ICommonPersonService.class); + + public ReportWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + +// if (!ToolUtil.isEmpty(map.get("remarks"))) { +// String s = map.get("remarks").toString(); +// String[] arr = s.split(";"); +// s = arr[0].substring(arr[0].indexOf(":") + 1); +// if (arr.length > 1) { +// for (int i = 1; i < arr.length; i++) { +// s = s + ";" + arr[i].substring(arr[i].indexOf(":") + 1); +// } +// } +// map.put("remarks", s); +// } + + ShiroUser shiroUser = commonPermissionService .getCurrLoginUser(); + Person person = commonPersonService.getPersonById((Serializable) map.get("personId")); + Map personExt = (Map)person.getExt(); + if (shiroUser.getRoleNames().contains("人事处")) { + String isZhuanwu = Convert.toStr(personExt.get("isZhuanwu")); + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (map.get("deptName").toString().equals("人力资源处") || (isZhuanwu != null && isZhuanwu.equals("1")) || (isLeader != null && isLeader.equals("1"))) { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } else map.put("canEdit", "0"); + } else if (shiroUser.getRoleNames().contains("部门领导")) { + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (isLeader != null && isLeader.equals("1")) { + map.put("canEdit", "0"); + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + + + + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java new file mode 100644 index 0000000..be6157b --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.util.Map; + +/** + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class SpecialDayWarpper extends BaseControllerWarpper { + + public SpecialDayWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + if(!ToolUtil.isEmpty(map.get("isKaoqin"))) { + if(map.get("isKaoqin").equals("1")) map.put("isKaoqinName", "是"); + else map.put("isKaoqinName", "否"); + }else{ + map.put("isKaoqinName", ""); + } + + } + +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java index fbb3d51..0940c31 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java @@ -1,9 +1,11 @@ package com.casic.missiles.modular.register.controller; +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ErrorResponseData; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.annotion.BussinessLog; import com.casic.missiles.core.common.constant.Const; @@ -17,23 +19,30 @@ import com.casic.missiles.core.log.LogObjectHolder; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.enums.IrisExportEnum; import com.casic.missiles.modular.register.model.IrisPersonPhoto; import com.casic.missiles.modular.register.service.IIrisDataService; import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; +import com.casic.missiles.modular.register.service.impl.IrisPersonServiceImpl; import com.casic.missiles.modular.register.util.Base64Util; +import com.casic.missiles.modular.register.warpper.IrisPersonWarpper; import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.dto.PersonResDto; import com.casic.missiles.modular.system.model.Person; import com.casic.missiles.service.ICasicFileService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.SocketTimeoutException; import java.util.List; import java.util.Map; @@ -46,6 +55,7 @@ @RestController @RequestMapping("/person") public class IrisPersonController extends ExportController { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonController.class); @Autowired private ICommonPermissionService permissionService; @@ -174,6 +184,7 @@ Page> defaultPage = new PageFactory>().defaultPage(); DataScope scope = permissionService.getCurrUserDataScope(); Page> page = getPersonPage(defaultPage, keywords, sex, duty, deptid, personType, startTime, endTime, scope); + return ResponseData.success(super.packForBT(page)); } @@ -203,6 +214,7 @@ } query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); List> scopePersons = irisPersonService.selectDataScopePersonMap(defaultPage, scope, query); + new IrisPersonWarpper(scopePersons).warp(); defaultPage.setRecords(scopePersons); query.orderBy(PersonConst.TABLE_PERSONCODE); //展示数据封装 @@ -219,4 +231,30 @@ return ResponseData.success(); } } + + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + + try { + //解析文件流 + ResponseData responseData = irisPersonService.parseSourceFile(file); + //校验及保存数据 + return irisPersonService.personImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("人员信息导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java new file mode 100644 index 0000000..c2b0114 --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java @@ -0,0 +1,165 @@ +package com.casic.missiles.modular.register.dto; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Person; +import org.apache.shiro.crypto.hash.Hash; +import org.apache.xmlbeans.impl.xb.xsdschema.Public; +import org.springframework.beans.factory.annotation.Autowired; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class PersonAtdDTO { + + private Long id;//主键 + private String name;//开始日期 + private String deptName;//开始时间 + private String idCardNo;//结束日期 + private String isKaoqin;//结束时间 + private String isOt; + private String isZhuanwu;//备注信息 + private String isLeader;//备注类型 + private String initAnnualLeave; + private String annualLeave; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getIdCardNo() { + return idCardNo; + } + + public void setIdCardNo(String idCardNo) { + this.idCardNo = idCardNo; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + public String getIsZhuanwu() { + return isZhuanwu; + } + + public void setIsZhuanwu(String isZhuanwu) { + this.isZhuanwu = isZhuanwu; + } + + public String getIsLeader() { + return isLeader; + } + + public void setIsLeader(String isLeader) { + this.isLeader = isLeader; + } + + public String getInitAnnualLeave() { + return initAnnualLeave; + } + + public void setInitAnnualLeave(String initAnnualLeave) { + this.initAnnualLeave = initAnnualLeave; + } + + public String getAnnualLeave() { + return annualLeave; + } + + public void setAnnualLeave(String annualLeave) { + this.annualLeave = annualLeave; + } + + public String getIsOt() { + return isOt; + } + + public void setIsOt(String isOt) { + this.isOt = isOt; + } + + @Override + public String toString() { + return "PerosnDTO{" + + "id=" + id + + ", name='" + name + '\'' + + ", deptName='" + deptName + '\'' + + ", idCardNo='" + idCardNo + '\'' + + ", isKaoqin='" + isKaoqin + '\'' + + ", isZhuanwu='" + isZhuanwu + '\'' + + ", isLeader='" + isLeader + '\'' + + ", initAnnualLeave='" + initAnnualLeave + '\'' + + ", annualLeave='" + annualLeave + '\'' + + '}'; + } + + public Person toPerson(){ + Person person = new Person(); + try { + person.setName(this.name); + person.setIdCardNo(this.idCardNo); + person.setDelflag("0"); + + Map mapExt = new HashMap<>(); + mapExt.put("initAnnualLeave",this.initAnnualLeave); + mapExt.put("annualLeave",this.annualLeave); + if(this.isKaoqin!=null && !this.isKaoqin.equals("") && this.isKaoqin.equals("否")) + {mapExt.put("isKaoqin","0");}else mapExt.put("isKaoqin","1"); + + if(this.isOt!=null && !this.isOt.equals("") && this.isOt.equals("是")) + {mapExt.put("isOt","1");}else mapExt.put("isOt","0"); + + if(this.isZhuanwu!=null && !this.isZhuanwu.equals("") && this.isZhuanwu.equals("是")) + {mapExt.put("isZhuanwu","1");}else mapExt.put("isZhuanwu","0"); + + if(this.isLeader!=null && !this.isLeader.equals("") && this.isLeader.equals("是")) + {mapExt.put("isLeader","1");}else mapExt.put("isLeader","0"); + + person.setExt(mapExt); + + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + return person; + } +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java index 68b16a8..1c9226b 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java @@ -3,10 +3,14 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.model.IrisData; +import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.model.Person; import org.apache.ibatis.annotations.Param; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -29,4 +33,17 @@ void insert(Person person); void update(Person person); + + /** + * 特殊考勤日数据导入 + * @param list 专题库集合 + */ + ResponseData personImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java index d936cc2..1a411ca 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java @@ -2,33 +2,61 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.constant.Const; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.common.service.ICommonPersonService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.exception.GunsException; import com.casic.missiles.core.meta.annotations.MetaDataBean; +import com.casic.missiles.core.util.Convert; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; import com.casic.missiles.modular.register.constant.IrisPersonConst; import com.casic.missiles.modular.register.dao.IrisDataMapper; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; +import com.casic.missiles.modular.register.enums.PersonTypeEnums; import com.casic.missiles.modular.register.service.IIrisDataService; +import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; import com.casic.missiles.modular.system.dto.PersonDto; +import com.casic.missiles.modular.system.model.Dept; import com.casic.missiles.modular.system.model.Person; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.hswebframework.expands.office.excel.ExcelIO; +import java.io.InputStream; import java.io.Serializable; +import java.sql.Date; import java.sql.Timestamp; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Service public class IrisPersonServiceImpl implements IIrisPersonService { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonServiceImpl.class); + protected static final Map mapperExcel = new HashMap<>(); + static { + mapperExcel.put("姓名", "name"); + mapperExcel.put("部门", "deptName"); + mapperExcel.put("身份证号", "idCardNo"); + mapperExcel.put("是否考勤(默认是)", "isKaoqin"); + mapperExcel.put("是否统计加班(默认否)", "isOt"); + mapperExcel.put("是否专务(默认否)", "isZhuanwu"); + mapperExcel.put("是否正职领导(默认否)", "isLeader"); + mapperExcel.put("年假(天)", "initAnnualLeave"); + mapperExcel.put("剩余年假(天)","annualLeave"); + } + @Value("${casic.base.personPrefix:}") private String personPrefix; @Autowired @@ -41,6 +69,11 @@ private IMetadataSupportService supportService; @Autowired private IIrisDataService irisDataService; + @Autowired + private IIrisPersonService irisPersonService; + @Autowired + private ICommonDeptService commonDeptService; + @Transactional(rollbackFor = Exception.class) @Override @@ -108,6 +141,116 @@ personService.updatePerson(person); } + + /** + * 员工导入 + * + * @param list 员工集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData personImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + List personList = new ArrayList<>(); + List deptList = commonDeptService.getDeptByTips(null); + Person person = new Person(); + //处理人员信息 + int index = 2; + try { + for (PersonAtdDTO personDto : list) { + person = new Person(); + + // 判断部门信息 + if (ToolUtil.isEmpty(personDto.getDeptName())) { + results.add("第" + index + "行,部门不能为空"); + break; + }else { + for (Dept dept : deptList) { + if (personDto.getDeptName().equals(dept.getSimplename())){ + person.setDeptid(dept.getId()); + break; + } + } + if(ToolUtil.isEmpty(person.getDeptid())){ + results.add("第" + index + "行,部门信息不正确"); + break; + } + } + + if (ToolUtil.isEmpty(personDto.getName())) { + results.add("第" + index + "行,姓名不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getIdCardNo())) { + results.add("第" + index + "行,身份证号不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getInitAnnualLeave())) { + results.add("第" + index + "行,年假天数不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getAnnualLeave())) { + results.add("第" + index + "行,剩余年假天数不能为空"); + break; + } else { + Long deptid = person.getDeptid(); + person = personDto.toPerson(); + person.setDeptid(deptid); + person.setPersonType(PersonTypeEnums.STAFF.getValue()); + person.setOprationId(permissionService.getCurrLoginUser().getId()); + // 根据身份证号得到生日和性别 + String idCardNo = personDto.getIdCardNo(); + String birth = ""; + if (idCardNo.length() == 15) birth = "19" + idCardNo.substring(6, 8)+"-"+idCardNo.substring(8,10)+"-"+idCardNo.substring(10,12); + else if (idCardNo.length() == 18) + { + birth = idCardNo.substring(6, 10)+"-"+idCardNo.substring(10,12)+"-"+idCardNo.substring(12,14); + if ((Convert.toInt(idCardNo.substring(16, 17)) % 2) == 1)//奇数 + { + person.setSex("1"); + } + else person.setSex("2"); + } + person.setBirthday(Date.valueOf(birth)); + + irisPersonService.insert(person); + } + index++; + } + } catch(DuplicateKeyException e){ + e.printStackTrace(); + GunsException gunsException = new GunsException(BizExceptionEnum.SERVER_ERROR); + gunsException.setMessage(e.getMessage().contains("ID_CARD_INDEX") ? "身份证号重复" : "人员编码重复"); + throw gunsException; + } + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List personDtoList = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapperExcel, PersonAtdDTO.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + PersonAtdDTO personDto = row.getResult(); + personDtoList.add(personDto); + } + } else { + //其他sheet停止读取 + logger.info("人员信息导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(personDtoList); + } + private void wrap(Map map) { map.put("deptName", permissionService.getDeptName((Serializable) map.get("deptid"))); if (ToolUtil.isNotEmpty(map.get(IrisPersonConst.PERSON_SEX_KEY))) { diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java new file mode 100644 index 0000000..a39eb1e --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java @@ -0,0 +1,68 @@ +package com.casic.missiles.modular.register.warpper; + + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import org.springframework.beans.factory.annotation.Value; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 人员的包装类 + * + * @date 2019年12月5日10:59:02 + */ +public class IrisPersonWarpper extends BaseControllerWarpper { + + + public IrisPersonWarpper(Object list) { + super(list); + } + ICommonPermissionService service = SpringContextHolder.getBean(ICommonPermissionService.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + @Override + public void warpTheMap(Map map) { + + Map mapExt = (Map)map.get("ext"); + //是否考勤 + if (!ToolUtil.isEmpty(mapExt.get("isKaoqin"))) { + if(mapExt.get("isKaoqin").equals("1")) { + map.put("isKaoqinName", "是"); + }else { + map.put("isKaoqinName", "否"); + } + } + //是否统计加班 + if (!ToolUtil.isEmpty(mapExt.get("isOt"))) { + if(mapExt.get("isOt").equals("1")) { + map.put("isOtName", "是"); + }else { + map.put("isOtName", "否"); + } + } + //是否专务 + if (!ToolUtil.isEmpty(mapExt.get("isZhuanwu"))) { + if(mapExt.get("isZhuanwu").equals("1")) { + map.put("isZhuanwuName", "是"); + }else { + map.put("isZhuanwuName", "否"); + } + } + //是否正职领导 + if (!ToolUtil.isEmpty(mapExt.get("isLeader"))) { + if(mapExt.get("isLeader").equals("1")) { + map.put("isLeaderName", "是"); + }else { + map.put("isLeaderName", "否"); + } + } + + + + } + +} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 464d675..71b3a85 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -122,6 +122,11 @@ casic-iris-register ${pro.version} + + com.casic + casic-iris-atd + ${pro.version} + org.springframework.boot diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java new file mode 100644 index 0000000..cfa238f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java @@ -0,0 +1,94 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class ReportWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + ICommonPermissionService commonPermissionService = SpringContextHolder.getBean(ICommonPermissionService.class); + ICommonPersonService commonPersonService = SpringContextHolder.getBean(ICommonPersonService.class); + + public ReportWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + +// if (!ToolUtil.isEmpty(map.get("remarks"))) { +// String s = map.get("remarks").toString(); +// String[] arr = s.split(";"); +// s = arr[0].substring(arr[0].indexOf(":") + 1); +// if (arr.length > 1) { +// for (int i = 1; i < arr.length; i++) { +// s = s + ";" + arr[i].substring(arr[i].indexOf(":") + 1); +// } +// } +// map.put("remarks", s); +// } + + ShiroUser shiroUser = commonPermissionService .getCurrLoginUser(); + Person person = commonPersonService.getPersonById((Serializable) map.get("personId")); + Map personExt = (Map)person.getExt(); + if (shiroUser.getRoleNames().contains("人事处")) { + String isZhuanwu = Convert.toStr(personExt.get("isZhuanwu")); + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (map.get("deptName").toString().equals("人力资源处") || (isZhuanwu != null && isZhuanwu.equals("1")) || (isLeader != null && isLeader.equals("1"))) { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } else map.put("canEdit", "0"); + } else if (shiroUser.getRoleNames().contains("部门领导")) { + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (isLeader != null && isLeader.equals("1")) { + map.put("canEdit", "0"); + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + + + + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java new file mode 100644 index 0000000..be6157b --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.util.Map; + +/** + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class SpecialDayWarpper extends BaseControllerWarpper { + + public SpecialDayWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + if(!ToolUtil.isEmpty(map.get("isKaoqin"))) { + if(map.get("isKaoqin").equals("1")) map.put("isKaoqinName", "是"); + else map.put("isKaoqinName", "否"); + }else{ + map.put("isKaoqinName", ""); + } + + } + +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java index fbb3d51..0940c31 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java @@ -1,9 +1,11 @@ package com.casic.missiles.modular.register.controller; +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ErrorResponseData; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.annotion.BussinessLog; import com.casic.missiles.core.common.constant.Const; @@ -17,23 +19,30 @@ import com.casic.missiles.core.log.LogObjectHolder; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.enums.IrisExportEnum; import com.casic.missiles.modular.register.model.IrisPersonPhoto; import com.casic.missiles.modular.register.service.IIrisDataService; import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; +import com.casic.missiles.modular.register.service.impl.IrisPersonServiceImpl; import com.casic.missiles.modular.register.util.Base64Util; +import com.casic.missiles.modular.register.warpper.IrisPersonWarpper; import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.dto.PersonResDto; import com.casic.missiles.modular.system.model.Person; import com.casic.missiles.service.ICasicFileService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.SocketTimeoutException; import java.util.List; import java.util.Map; @@ -46,6 +55,7 @@ @RestController @RequestMapping("/person") public class IrisPersonController extends ExportController { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonController.class); @Autowired private ICommonPermissionService permissionService; @@ -174,6 +184,7 @@ Page> defaultPage = new PageFactory>().defaultPage(); DataScope scope = permissionService.getCurrUserDataScope(); Page> page = getPersonPage(defaultPage, keywords, sex, duty, deptid, personType, startTime, endTime, scope); + return ResponseData.success(super.packForBT(page)); } @@ -203,6 +214,7 @@ } query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); List> scopePersons = irisPersonService.selectDataScopePersonMap(defaultPage, scope, query); + new IrisPersonWarpper(scopePersons).warp(); defaultPage.setRecords(scopePersons); query.orderBy(PersonConst.TABLE_PERSONCODE); //展示数据封装 @@ -219,4 +231,30 @@ return ResponseData.success(); } } + + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + + try { + //解析文件流 + ResponseData responseData = irisPersonService.parseSourceFile(file); + //校验及保存数据 + return irisPersonService.personImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("人员信息导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java new file mode 100644 index 0000000..c2b0114 --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java @@ -0,0 +1,165 @@ +package com.casic.missiles.modular.register.dto; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Person; +import org.apache.shiro.crypto.hash.Hash; +import org.apache.xmlbeans.impl.xb.xsdschema.Public; +import org.springframework.beans.factory.annotation.Autowired; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class PersonAtdDTO { + + private Long id;//主键 + private String name;//开始日期 + private String deptName;//开始时间 + private String idCardNo;//结束日期 + private String isKaoqin;//结束时间 + private String isOt; + private String isZhuanwu;//备注信息 + private String isLeader;//备注类型 + private String initAnnualLeave; + private String annualLeave; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getIdCardNo() { + return idCardNo; + } + + public void setIdCardNo(String idCardNo) { + this.idCardNo = idCardNo; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + public String getIsZhuanwu() { + return isZhuanwu; + } + + public void setIsZhuanwu(String isZhuanwu) { + this.isZhuanwu = isZhuanwu; + } + + public String getIsLeader() { + return isLeader; + } + + public void setIsLeader(String isLeader) { + this.isLeader = isLeader; + } + + public String getInitAnnualLeave() { + return initAnnualLeave; + } + + public void setInitAnnualLeave(String initAnnualLeave) { + this.initAnnualLeave = initAnnualLeave; + } + + public String getAnnualLeave() { + return annualLeave; + } + + public void setAnnualLeave(String annualLeave) { + this.annualLeave = annualLeave; + } + + public String getIsOt() { + return isOt; + } + + public void setIsOt(String isOt) { + this.isOt = isOt; + } + + @Override + public String toString() { + return "PerosnDTO{" + + "id=" + id + + ", name='" + name + '\'' + + ", deptName='" + deptName + '\'' + + ", idCardNo='" + idCardNo + '\'' + + ", isKaoqin='" + isKaoqin + '\'' + + ", isZhuanwu='" + isZhuanwu + '\'' + + ", isLeader='" + isLeader + '\'' + + ", initAnnualLeave='" + initAnnualLeave + '\'' + + ", annualLeave='" + annualLeave + '\'' + + '}'; + } + + public Person toPerson(){ + Person person = new Person(); + try { + person.setName(this.name); + person.setIdCardNo(this.idCardNo); + person.setDelflag("0"); + + Map mapExt = new HashMap<>(); + mapExt.put("initAnnualLeave",this.initAnnualLeave); + mapExt.put("annualLeave",this.annualLeave); + if(this.isKaoqin!=null && !this.isKaoqin.equals("") && this.isKaoqin.equals("否")) + {mapExt.put("isKaoqin","0");}else mapExt.put("isKaoqin","1"); + + if(this.isOt!=null && !this.isOt.equals("") && this.isOt.equals("是")) + {mapExt.put("isOt","1");}else mapExt.put("isOt","0"); + + if(this.isZhuanwu!=null && !this.isZhuanwu.equals("") && this.isZhuanwu.equals("是")) + {mapExt.put("isZhuanwu","1");}else mapExt.put("isZhuanwu","0"); + + if(this.isLeader!=null && !this.isLeader.equals("") && this.isLeader.equals("是")) + {mapExt.put("isLeader","1");}else mapExt.put("isLeader","0"); + + person.setExt(mapExt); + + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + return person; + } +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java index 68b16a8..1c9226b 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java @@ -3,10 +3,14 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.model.IrisData; +import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.model.Person; import org.apache.ibatis.annotations.Param; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -29,4 +33,17 @@ void insert(Person person); void update(Person person); + + /** + * 特殊考勤日数据导入 + * @param list 专题库集合 + */ + ResponseData personImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java index d936cc2..1a411ca 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java @@ -2,33 +2,61 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.constant.Const; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.common.service.ICommonPersonService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.exception.GunsException; import com.casic.missiles.core.meta.annotations.MetaDataBean; +import com.casic.missiles.core.util.Convert; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; import com.casic.missiles.modular.register.constant.IrisPersonConst; import com.casic.missiles.modular.register.dao.IrisDataMapper; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; +import com.casic.missiles.modular.register.enums.PersonTypeEnums; import com.casic.missiles.modular.register.service.IIrisDataService; +import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; import com.casic.missiles.modular.system.dto.PersonDto; +import com.casic.missiles.modular.system.model.Dept; import com.casic.missiles.modular.system.model.Person; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.hswebframework.expands.office.excel.ExcelIO; +import java.io.InputStream; import java.io.Serializable; +import java.sql.Date; import java.sql.Timestamp; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Service public class IrisPersonServiceImpl implements IIrisPersonService { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonServiceImpl.class); + protected static final Map mapperExcel = new HashMap<>(); + static { + mapperExcel.put("姓名", "name"); + mapperExcel.put("部门", "deptName"); + mapperExcel.put("身份证号", "idCardNo"); + mapperExcel.put("是否考勤(默认是)", "isKaoqin"); + mapperExcel.put("是否统计加班(默认否)", "isOt"); + mapperExcel.put("是否专务(默认否)", "isZhuanwu"); + mapperExcel.put("是否正职领导(默认否)", "isLeader"); + mapperExcel.put("年假(天)", "initAnnualLeave"); + mapperExcel.put("剩余年假(天)","annualLeave"); + } + @Value("${casic.base.personPrefix:}") private String personPrefix; @Autowired @@ -41,6 +69,11 @@ private IMetadataSupportService supportService; @Autowired private IIrisDataService irisDataService; + @Autowired + private IIrisPersonService irisPersonService; + @Autowired + private ICommonDeptService commonDeptService; + @Transactional(rollbackFor = Exception.class) @Override @@ -108,6 +141,116 @@ personService.updatePerson(person); } + + /** + * 员工导入 + * + * @param list 员工集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData personImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + List personList = new ArrayList<>(); + List deptList = commonDeptService.getDeptByTips(null); + Person person = new Person(); + //处理人员信息 + int index = 2; + try { + for (PersonAtdDTO personDto : list) { + person = new Person(); + + // 判断部门信息 + if (ToolUtil.isEmpty(personDto.getDeptName())) { + results.add("第" + index + "行,部门不能为空"); + break; + }else { + for (Dept dept : deptList) { + if (personDto.getDeptName().equals(dept.getSimplename())){ + person.setDeptid(dept.getId()); + break; + } + } + if(ToolUtil.isEmpty(person.getDeptid())){ + results.add("第" + index + "行,部门信息不正确"); + break; + } + } + + if (ToolUtil.isEmpty(personDto.getName())) { + results.add("第" + index + "行,姓名不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getIdCardNo())) { + results.add("第" + index + "行,身份证号不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getInitAnnualLeave())) { + results.add("第" + index + "行,年假天数不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getAnnualLeave())) { + results.add("第" + index + "行,剩余年假天数不能为空"); + break; + } else { + Long deptid = person.getDeptid(); + person = personDto.toPerson(); + person.setDeptid(deptid); + person.setPersonType(PersonTypeEnums.STAFF.getValue()); + person.setOprationId(permissionService.getCurrLoginUser().getId()); + // 根据身份证号得到生日和性别 + String idCardNo = personDto.getIdCardNo(); + String birth = ""; + if (idCardNo.length() == 15) birth = "19" + idCardNo.substring(6, 8)+"-"+idCardNo.substring(8,10)+"-"+idCardNo.substring(10,12); + else if (idCardNo.length() == 18) + { + birth = idCardNo.substring(6, 10)+"-"+idCardNo.substring(10,12)+"-"+idCardNo.substring(12,14); + if ((Convert.toInt(idCardNo.substring(16, 17)) % 2) == 1)//奇数 + { + person.setSex("1"); + } + else person.setSex("2"); + } + person.setBirthday(Date.valueOf(birth)); + + irisPersonService.insert(person); + } + index++; + } + } catch(DuplicateKeyException e){ + e.printStackTrace(); + GunsException gunsException = new GunsException(BizExceptionEnum.SERVER_ERROR); + gunsException.setMessage(e.getMessage().contains("ID_CARD_INDEX") ? "身份证号重复" : "人员编码重复"); + throw gunsException; + } + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List personDtoList = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapperExcel, PersonAtdDTO.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + PersonAtdDTO personDto = row.getResult(); + personDtoList.add(personDto); + } + } else { + //其他sheet停止读取 + logger.info("人员信息导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(personDtoList); + } + private void wrap(Map map) { map.put("deptName", permissionService.getDeptName((Serializable) map.get("deptid"))); if (ToolUtil.isNotEmpty(map.get(IrisPersonConst.PERSON_SEX_KEY))) { diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java new file mode 100644 index 0000000..a39eb1e --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java @@ -0,0 +1,68 @@ +package com.casic.missiles.modular.register.warpper; + + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import org.springframework.beans.factory.annotation.Value; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 人员的包装类 + * + * @date 2019年12月5日10:59:02 + */ +public class IrisPersonWarpper extends BaseControllerWarpper { + + + public IrisPersonWarpper(Object list) { + super(list); + } + ICommonPermissionService service = SpringContextHolder.getBean(ICommonPermissionService.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + @Override + public void warpTheMap(Map map) { + + Map mapExt = (Map)map.get("ext"); + //是否考勤 + if (!ToolUtil.isEmpty(mapExt.get("isKaoqin"))) { + if(mapExt.get("isKaoqin").equals("1")) { + map.put("isKaoqinName", "是"); + }else { + map.put("isKaoqinName", "否"); + } + } + //是否统计加班 + if (!ToolUtil.isEmpty(mapExt.get("isOt"))) { + if(mapExt.get("isOt").equals("1")) { + map.put("isOtName", "是"); + }else { + map.put("isOtName", "否"); + } + } + //是否专务 + if (!ToolUtil.isEmpty(mapExt.get("isZhuanwu"))) { + if(mapExt.get("isZhuanwu").equals("1")) { + map.put("isZhuanwuName", "是"); + }else { + map.put("isZhuanwuName", "否"); + } + } + //是否正职领导 + if (!ToolUtil.isEmpty(mapExt.get("isLeader"))) { + if(mapExt.get("isLeader").equals("1")) { + map.put("isLeaderName", "是"); + }else { + map.put("isLeaderName", "否"); + } + } + + + + } + +} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 464d675..71b3a85 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -122,6 +122,11 @@ casic-iris-register ${pro.version}
+ + com.casic + casic-iris-atd + ${pro.version} + org.springframework.boot diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 1423ba3..3ef2e8e 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,5 +1,6 @@ package com.casic.missiles; +import com.casic.missiles.modular.system.task.GenerateReportTask; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; @@ -10,6 +11,10 @@ import java.io.FileNotFoundException; +import java.lang.reflect.GenericArrayType; +import java.text.ParseException; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; /** * SpringBoot方式启动类 @@ -24,10 +29,13 @@ private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); - public static void main(String[] args) throws FileNotFoundException { + public static void main(String[] args) throws FileNotFoundException, ParseException { + SpringApplication.run(CasicApplication.class, args); logger.info("GunsApplication is success!"); +// GenerateReportTask task = new GenerateReportTask(); +// task.generateTask(); } } diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java new file mode 100644 index 0000000..cfa238f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java @@ -0,0 +1,94 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class ReportWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + ICommonPermissionService commonPermissionService = SpringContextHolder.getBean(ICommonPermissionService.class); + ICommonPersonService commonPersonService = SpringContextHolder.getBean(ICommonPersonService.class); + + public ReportWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + +// if (!ToolUtil.isEmpty(map.get("remarks"))) { +// String s = map.get("remarks").toString(); +// String[] arr = s.split(";"); +// s = arr[0].substring(arr[0].indexOf(":") + 1); +// if (arr.length > 1) { +// for (int i = 1; i < arr.length; i++) { +// s = s + ";" + arr[i].substring(arr[i].indexOf(":") + 1); +// } +// } +// map.put("remarks", s); +// } + + ShiroUser shiroUser = commonPermissionService .getCurrLoginUser(); + Person person = commonPersonService.getPersonById((Serializable) map.get("personId")); + Map personExt = (Map)person.getExt(); + if (shiroUser.getRoleNames().contains("人事处")) { + String isZhuanwu = Convert.toStr(personExt.get("isZhuanwu")); + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (map.get("deptName").toString().equals("人力资源处") || (isZhuanwu != null && isZhuanwu.equals("1")) || (isLeader != null && isLeader.equals("1"))) { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } else map.put("canEdit", "0"); + } else if (shiroUser.getRoleNames().contains("部门领导")) { + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (isLeader != null && isLeader.equals("1")) { + map.put("canEdit", "0"); + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + + + + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java new file mode 100644 index 0000000..be6157b --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.util.Map; + +/** + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class SpecialDayWarpper extends BaseControllerWarpper { + + public SpecialDayWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + if(!ToolUtil.isEmpty(map.get("isKaoqin"))) { + if(map.get("isKaoqin").equals("1")) map.put("isKaoqinName", "是"); + else map.put("isKaoqinName", "否"); + }else{ + map.put("isKaoqinName", ""); + } + + } + +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java index fbb3d51..0940c31 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java @@ -1,9 +1,11 @@ package com.casic.missiles.modular.register.controller; +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ErrorResponseData; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.annotion.BussinessLog; import com.casic.missiles.core.common.constant.Const; @@ -17,23 +19,30 @@ import com.casic.missiles.core.log.LogObjectHolder; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.enums.IrisExportEnum; import com.casic.missiles.modular.register.model.IrisPersonPhoto; import com.casic.missiles.modular.register.service.IIrisDataService; import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; +import com.casic.missiles.modular.register.service.impl.IrisPersonServiceImpl; import com.casic.missiles.modular.register.util.Base64Util; +import com.casic.missiles.modular.register.warpper.IrisPersonWarpper; import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.dto.PersonResDto; import com.casic.missiles.modular.system.model.Person; import com.casic.missiles.service.ICasicFileService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.SocketTimeoutException; import java.util.List; import java.util.Map; @@ -46,6 +55,7 @@ @RestController @RequestMapping("/person") public class IrisPersonController extends ExportController { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonController.class); @Autowired private ICommonPermissionService permissionService; @@ -174,6 +184,7 @@ Page> defaultPage = new PageFactory>().defaultPage(); DataScope scope = permissionService.getCurrUserDataScope(); Page> page = getPersonPage(defaultPage, keywords, sex, duty, deptid, personType, startTime, endTime, scope); + return ResponseData.success(super.packForBT(page)); } @@ -203,6 +214,7 @@ } query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); List> scopePersons = irisPersonService.selectDataScopePersonMap(defaultPage, scope, query); + new IrisPersonWarpper(scopePersons).warp(); defaultPage.setRecords(scopePersons); query.orderBy(PersonConst.TABLE_PERSONCODE); //展示数据封装 @@ -219,4 +231,30 @@ return ResponseData.success(); } } + + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + + try { + //解析文件流 + ResponseData responseData = irisPersonService.parseSourceFile(file); + //校验及保存数据 + return irisPersonService.personImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("人员信息导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java new file mode 100644 index 0000000..c2b0114 --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java @@ -0,0 +1,165 @@ +package com.casic.missiles.modular.register.dto; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Person; +import org.apache.shiro.crypto.hash.Hash; +import org.apache.xmlbeans.impl.xb.xsdschema.Public; +import org.springframework.beans.factory.annotation.Autowired; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class PersonAtdDTO { + + private Long id;//主键 + private String name;//开始日期 + private String deptName;//开始时间 + private String idCardNo;//结束日期 + private String isKaoqin;//结束时间 + private String isOt; + private String isZhuanwu;//备注信息 + private String isLeader;//备注类型 + private String initAnnualLeave; + private String annualLeave; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getIdCardNo() { + return idCardNo; + } + + public void setIdCardNo(String idCardNo) { + this.idCardNo = idCardNo; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + public String getIsZhuanwu() { + return isZhuanwu; + } + + public void setIsZhuanwu(String isZhuanwu) { + this.isZhuanwu = isZhuanwu; + } + + public String getIsLeader() { + return isLeader; + } + + public void setIsLeader(String isLeader) { + this.isLeader = isLeader; + } + + public String getInitAnnualLeave() { + return initAnnualLeave; + } + + public void setInitAnnualLeave(String initAnnualLeave) { + this.initAnnualLeave = initAnnualLeave; + } + + public String getAnnualLeave() { + return annualLeave; + } + + public void setAnnualLeave(String annualLeave) { + this.annualLeave = annualLeave; + } + + public String getIsOt() { + return isOt; + } + + public void setIsOt(String isOt) { + this.isOt = isOt; + } + + @Override + public String toString() { + return "PerosnDTO{" + + "id=" + id + + ", name='" + name + '\'' + + ", deptName='" + deptName + '\'' + + ", idCardNo='" + idCardNo + '\'' + + ", isKaoqin='" + isKaoqin + '\'' + + ", isZhuanwu='" + isZhuanwu + '\'' + + ", isLeader='" + isLeader + '\'' + + ", initAnnualLeave='" + initAnnualLeave + '\'' + + ", annualLeave='" + annualLeave + '\'' + + '}'; + } + + public Person toPerson(){ + Person person = new Person(); + try { + person.setName(this.name); + person.setIdCardNo(this.idCardNo); + person.setDelflag("0"); + + Map mapExt = new HashMap<>(); + mapExt.put("initAnnualLeave",this.initAnnualLeave); + mapExt.put("annualLeave",this.annualLeave); + if(this.isKaoqin!=null && !this.isKaoqin.equals("") && this.isKaoqin.equals("否")) + {mapExt.put("isKaoqin","0");}else mapExt.put("isKaoqin","1"); + + if(this.isOt!=null && !this.isOt.equals("") && this.isOt.equals("是")) + {mapExt.put("isOt","1");}else mapExt.put("isOt","0"); + + if(this.isZhuanwu!=null && !this.isZhuanwu.equals("") && this.isZhuanwu.equals("是")) + {mapExt.put("isZhuanwu","1");}else mapExt.put("isZhuanwu","0"); + + if(this.isLeader!=null && !this.isLeader.equals("") && this.isLeader.equals("是")) + {mapExt.put("isLeader","1");}else mapExt.put("isLeader","0"); + + person.setExt(mapExt); + + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + return person; + } +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java index 68b16a8..1c9226b 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java @@ -3,10 +3,14 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.model.IrisData; +import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.model.Person; import org.apache.ibatis.annotations.Param; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -29,4 +33,17 @@ void insert(Person person); void update(Person person); + + /** + * 特殊考勤日数据导入 + * @param list 专题库集合 + */ + ResponseData personImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java index d936cc2..1a411ca 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java @@ -2,33 +2,61 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.constant.Const; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.common.service.ICommonPersonService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.exception.GunsException; import com.casic.missiles.core.meta.annotations.MetaDataBean; +import com.casic.missiles.core.util.Convert; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; import com.casic.missiles.modular.register.constant.IrisPersonConst; import com.casic.missiles.modular.register.dao.IrisDataMapper; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; +import com.casic.missiles.modular.register.enums.PersonTypeEnums; import com.casic.missiles.modular.register.service.IIrisDataService; +import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; import com.casic.missiles.modular.system.dto.PersonDto; +import com.casic.missiles.modular.system.model.Dept; import com.casic.missiles.modular.system.model.Person; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.hswebframework.expands.office.excel.ExcelIO; +import java.io.InputStream; import java.io.Serializable; +import java.sql.Date; import java.sql.Timestamp; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Service public class IrisPersonServiceImpl implements IIrisPersonService { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonServiceImpl.class); + protected static final Map mapperExcel = new HashMap<>(); + static { + mapperExcel.put("姓名", "name"); + mapperExcel.put("部门", "deptName"); + mapperExcel.put("身份证号", "idCardNo"); + mapperExcel.put("是否考勤(默认是)", "isKaoqin"); + mapperExcel.put("是否统计加班(默认否)", "isOt"); + mapperExcel.put("是否专务(默认否)", "isZhuanwu"); + mapperExcel.put("是否正职领导(默认否)", "isLeader"); + mapperExcel.put("年假(天)", "initAnnualLeave"); + mapperExcel.put("剩余年假(天)","annualLeave"); + } + @Value("${casic.base.personPrefix:}") private String personPrefix; @Autowired @@ -41,6 +69,11 @@ private IMetadataSupportService supportService; @Autowired private IIrisDataService irisDataService; + @Autowired + private IIrisPersonService irisPersonService; + @Autowired + private ICommonDeptService commonDeptService; + @Transactional(rollbackFor = Exception.class) @Override @@ -108,6 +141,116 @@ personService.updatePerson(person); } + + /** + * 员工导入 + * + * @param list 员工集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData personImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + List personList = new ArrayList<>(); + List deptList = commonDeptService.getDeptByTips(null); + Person person = new Person(); + //处理人员信息 + int index = 2; + try { + for (PersonAtdDTO personDto : list) { + person = new Person(); + + // 判断部门信息 + if (ToolUtil.isEmpty(personDto.getDeptName())) { + results.add("第" + index + "行,部门不能为空"); + break; + }else { + for (Dept dept : deptList) { + if (personDto.getDeptName().equals(dept.getSimplename())){ + person.setDeptid(dept.getId()); + break; + } + } + if(ToolUtil.isEmpty(person.getDeptid())){ + results.add("第" + index + "行,部门信息不正确"); + break; + } + } + + if (ToolUtil.isEmpty(personDto.getName())) { + results.add("第" + index + "行,姓名不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getIdCardNo())) { + results.add("第" + index + "行,身份证号不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getInitAnnualLeave())) { + results.add("第" + index + "行,年假天数不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getAnnualLeave())) { + results.add("第" + index + "行,剩余年假天数不能为空"); + break; + } else { + Long deptid = person.getDeptid(); + person = personDto.toPerson(); + person.setDeptid(deptid); + person.setPersonType(PersonTypeEnums.STAFF.getValue()); + person.setOprationId(permissionService.getCurrLoginUser().getId()); + // 根据身份证号得到生日和性别 + String idCardNo = personDto.getIdCardNo(); + String birth = ""; + if (idCardNo.length() == 15) birth = "19" + idCardNo.substring(6, 8)+"-"+idCardNo.substring(8,10)+"-"+idCardNo.substring(10,12); + else if (idCardNo.length() == 18) + { + birth = idCardNo.substring(6, 10)+"-"+idCardNo.substring(10,12)+"-"+idCardNo.substring(12,14); + if ((Convert.toInt(idCardNo.substring(16, 17)) % 2) == 1)//奇数 + { + person.setSex("1"); + } + else person.setSex("2"); + } + person.setBirthday(Date.valueOf(birth)); + + irisPersonService.insert(person); + } + index++; + } + } catch(DuplicateKeyException e){ + e.printStackTrace(); + GunsException gunsException = new GunsException(BizExceptionEnum.SERVER_ERROR); + gunsException.setMessage(e.getMessage().contains("ID_CARD_INDEX") ? "身份证号重复" : "人员编码重复"); + throw gunsException; + } + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List personDtoList = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapperExcel, PersonAtdDTO.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + PersonAtdDTO personDto = row.getResult(); + personDtoList.add(personDto); + } + } else { + //其他sheet停止读取 + logger.info("人员信息导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(personDtoList); + } + private void wrap(Map map) { map.put("deptName", permissionService.getDeptName((Serializable) map.get("deptid"))); if (ToolUtil.isNotEmpty(map.get(IrisPersonConst.PERSON_SEX_KEY))) { diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java new file mode 100644 index 0000000..a39eb1e --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java @@ -0,0 +1,68 @@ +package com.casic.missiles.modular.register.warpper; + + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import org.springframework.beans.factory.annotation.Value; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 人员的包装类 + * + * @date 2019年12月5日10:59:02 + */ +public class IrisPersonWarpper extends BaseControllerWarpper { + + + public IrisPersonWarpper(Object list) { + super(list); + } + ICommonPermissionService service = SpringContextHolder.getBean(ICommonPermissionService.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + @Override + public void warpTheMap(Map map) { + + Map mapExt = (Map)map.get("ext"); + //是否考勤 + if (!ToolUtil.isEmpty(mapExt.get("isKaoqin"))) { + if(mapExt.get("isKaoqin").equals("1")) { + map.put("isKaoqinName", "是"); + }else { + map.put("isKaoqinName", "否"); + } + } + //是否统计加班 + if (!ToolUtil.isEmpty(mapExt.get("isOt"))) { + if(mapExt.get("isOt").equals("1")) { + map.put("isOtName", "是"); + }else { + map.put("isOtName", "否"); + } + } + //是否专务 + if (!ToolUtil.isEmpty(mapExt.get("isZhuanwu"))) { + if(mapExt.get("isZhuanwu").equals("1")) { + map.put("isZhuanwuName", "是"); + }else { + map.put("isZhuanwuName", "否"); + } + } + //是否正职领导 + if (!ToolUtil.isEmpty(mapExt.get("isLeader"))) { + if(mapExt.get("isLeader").equals("1")) { + map.put("isLeaderName", "是"); + }else { + map.put("isLeaderName", "否"); + } + } + + + + } + +} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 464d675..71b3a85 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -122,6 +122,11 @@ casic-iris-register ${pro.version}
+ + com.casic + casic-iris-atd + ${pro.version} + org.springframework.boot diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 1423ba3..3ef2e8e 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,5 +1,6 @@ package com.casic.missiles; +import com.casic.missiles.modular.system.task.GenerateReportTask; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; @@ -10,6 +11,10 @@ import java.io.FileNotFoundException; +import java.lang.reflect.GenericArrayType; +import java.text.ParseException; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; /** * SpringBoot方式启动类 @@ -24,10 +29,13 @@ private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); - public static void main(String[] args) throws FileNotFoundException { + public static void main(String[] args) throws FileNotFoundException, ParseException { + SpringApplication.run(CasicApplication.class, args); logger.info("GunsApplication is success!"); +// GenerateReportTask task = new GenerateReportTask(); +// task.generateTask(); } } diff --git a/casic-web/src/main/resources/application.yml b/casic-web/src/main/resources/application.yml index 17b9bba..c80502c 100644 --- a/casic-web/src/main/resources/application.yml +++ b/casic-web/src/main/resources/application.yml @@ -21,4 +21,4 @@ server: tomcat: - max-http-post-size: -1 + max-http-post-size: -1 \ No newline at end of file diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java new file mode 100644 index 0000000..cfa238f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java @@ -0,0 +1,94 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class ReportWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + ICommonPermissionService commonPermissionService = SpringContextHolder.getBean(ICommonPermissionService.class); + ICommonPersonService commonPersonService = SpringContextHolder.getBean(ICommonPersonService.class); + + public ReportWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + +// if (!ToolUtil.isEmpty(map.get("remarks"))) { +// String s = map.get("remarks").toString(); +// String[] arr = s.split(";"); +// s = arr[0].substring(arr[0].indexOf(":") + 1); +// if (arr.length > 1) { +// for (int i = 1; i < arr.length; i++) { +// s = s + ";" + arr[i].substring(arr[i].indexOf(":") + 1); +// } +// } +// map.put("remarks", s); +// } + + ShiroUser shiroUser = commonPermissionService .getCurrLoginUser(); + Person person = commonPersonService.getPersonById((Serializable) map.get("personId")); + Map personExt = (Map)person.getExt(); + if (shiroUser.getRoleNames().contains("人事处")) { + String isZhuanwu = Convert.toStr(personExt.get("isZhuanwu")); + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (map.get("deptName").toString().equals("人力资源处") || (isZhuanwu != null && isZhuanwu.equals("1")) || (isLeader != null && isLeader.equals("1"))) { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } else map.put("canEdit", "0"); + } else if (shiroUser.getRoleNames().contains("部门领导")) { + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (isLeader != null && isLeader.equals("1")) { + map.put("canEdit", "0"); + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + + + + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java new file mode 100644 index 0000000..be6157b --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.util.Map; + +/** + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class SpecialDayWarpper extends BaseControllerWarpper { + + public SpecialDayWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + if(!ToolUtil.isEmpty(map.get("isKaoqin"))) { + if(map.get("isKaoqin").equals("1")) map.put("isKaoqinName", "是"); + else map.put("isKaoqinName", "否"); + }else{ + map.put("isKaoqinName", ""); + } + + } + +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java index fbb3d51..0940c31 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java @@ -1,9 +1,11 @@ package com.casic.missiles.modular.register.controller; +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ErrorResponseData; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.annotion.BussinessLog; import com.casic.missiles.core.common.constant.Const; @@ -17,23 +19,30 @@ import com.casic.missiles.core.log.LogObjectHolder; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.enums.IrisExportEnum; import com.casic.missiles.modular.register.model.IrisPersonPhoto; import com.casic.missiles.modular.register.service.IIrisDataService; import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; +import com.casic.missiles.modular.register.service.impl.IrisPersonServiceImpl; import com.casic.missiles.modular.register.util.Base64Util; +import com.casic.missiles.modular.register.warpper.IrisPersonWarpper; import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.dto.PersonResDto; import com.casic.missiles.modular.system.model.Person; import com.casic.missiles.service.ICasicFileService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.SocketTimeoutException; import java.util.List; import java.util.Map; @@ -46,6 +55,7 @@ @RestController @RequestMapping("/person") public class IrisPersonController extends ExportController { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonController.class); @Autowired private ICommonPermissionService permissionService; @@ -174,6 +184,7 @@ Page> defaultPage = new PageFactory>().defaultPage(); DataScope scope = permissionService.getCurrUserDataScope(); Page> page = getPersonPage(defaultPage, keywords, sex, duty, deptid, personType, startTime, endTime, scope); + return ResponseData.success(super.packForBT(page)); } @@ -203,6 +214,7 @@ } query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); List> scopePersons = irisPersonService.selectDataScopePersonMap(defaultPage, scope, query); + new IrisPersonWarpper(scopePersons).warp(); defaultPage.setRecords(scopePersons); query.orderBy(PersonConst.TABLE_PERSONCODE); //展示数据封装 @@ -219,4 +231,30 @@ return ResponseData.success(); } } + + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + + try { + //解析文件流 + ResponseData responseData = irisPersonService.parseSourceFile(file); + //校验及保存数据 + return irisPersonService.personImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("人员信息导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java new file mode 100644 index 0000000..c2b0114 --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java @@ -0,0 +1,165 @@ +package com.casic.missiles.modular.register.dto; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Person; +import org.apache.shiro.crypto.hash.Hash; +import org.apache.xmlbeans.impl.xb.xsdschema.Public; +import org.springframework.beans.factory.annotation.Autowired; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class PersonAtdDTO { + + private Long id;//主键 + private String name;//开始日期 + private String deptName;//开始时间 + private String idCardNo;//结束日期 + private String isKaoqin;//结束时间 + private String isOt; + private String isZhuanwu;//备注信息 + private String isLeader;//备注类型 + private String initAnnualLeave; + private String annualLeave; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getIdCardNo() { + return idCardNo; + } + + public void setIdCardNo(String idCardNo) { + this.idCardNo = idCardNo; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + public String getIsZhuanwu() { + return isZhuanwu; + } + + public void setIsZhuanwu(String isZhuanwu) { + this.isZhuanwu = isZhuanwu; + } + + public String getIsLeader() { + return isLeader; + } + + public void setIsLeader(String isLeader) { + this.isLeader = isLeader; + } + + public String getInitAnnualLeave() { + return initAnnualLeave; + } + + public void setInitAnnualLeave(String initAnnualLeave) { + this.initAnnualLeave = initAnnualLeave; + } + + public String getAnnualLeave() { + return annualLeave; + } + + public void setAnnualLeave(String annualLeave) { + this.annualLeave = annualLeave; + } + + public String getIsOt() { + return isOt; + } + + public void setIsOt(String isOt) { + this.isOt = isOt; + } + + @Override + public String toString() { + return "PerosnDTO{" + + "id=" + id + + ", name='" + name + '\'' + + ", deptName='" + deptName + '\'' + + ", idCardNo='" + idCardNo + '\'' + + ", isKaoqin='" + isKaoqin + '\'' + + ", isZhuanwu='" + isZhuanwu + '\'' + + ", isLeader='" + isLeader + '\'' + + ", initAnnualLeave='" + initAnnualLeave + '\'' + + ", annualLeave='" + annualLeave + '\'' + + '}'; + } + + public Person toPerson(){ + Person person = new Person(); + try { + person.setName(this.name); + person.setIdCardNo(this.idCardNo); + person.setDelflag("0"); + + Map mapExt = new HashMap<>(); + mapExt.put("initAnnualLeave",this.initAnnualLeave); + mapExt.put("annualLeave",this.annualLeave); + if(this.isKaoqin!=null && !this.isKaoqin.equals("") && this.isKaoqin.equals("否")) + {mapExt.put("isKaoqin","0");}else mapExt.put("isKaoqin","1"); + + if(this.isOt!=null && !this.isOt.equals("") && this.isOt.equals("是")) + {mapExt.put("isOt","1");}else mapExt.put("isOt","0"); + + if(this.isZhuanwu!=null && !this.isZhuanwu.equals("") && this.isZhuanwu.equals("是")) + {mapExt.put("isZhuanwu","1");}else mapExt.put("isZhuanwu","0"); + + if(this.isLeader!=null && !this.isLeader.equals("") && this.isLeader.equals("是")) + {mapExt.put("isLeader","1");}else mapExt.put("isLeader","0"); + + person.setExt(mapExt); + + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + return person; + } +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java index 68b16a8..1c9226b 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java @@ -3,10 +3,14 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.model.IrisData; +import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.model.Person; import org.apache.ibatis.annotations.Param; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -29,4 +33,17 @@ void insert(Person person); void update(Person person); + + /** + * 特殊考勤日数据导入 + * @param list 专题库集合 + */ + ResponseData personImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java index d936cc2..1a411ca 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java @@ -2,33 +2,61 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.constant.Const; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.common.service.ICommonPersonService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.exception.GunsException; import com.casic.missiles.core.meta.annotations.MetaDataBean; +import com.casic.missiles.core.util.Convert; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; import com.casic.missiles.modular.register.constant.IrisPersonConst; import com.casic.missiles.modular.register.dao.IrisDataMapper; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; +import com.casic.missiles.modular.register.enums.PersonTypeEnums; import com.casic.missiles.modular.register.service.IIrisDataService; +import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; import com.casic.missiles.modular.system.dto.PersonDto; +import com.casic.missiles.modular.system.model.Dept; import com.casic.missiles.modular.system.model.Person; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.hswebframework.expands.office.excel.ExcelIO; +import java.io.InputStream; import java.io.Serializable; +import java.sql.Date; import java.sql.Timestamp; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Service public class IrisPersonServiceImpl implements IIrisPersonService { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonServiceImpl.class); + protected static final Map mapperExcel = new HashMap<>(); + static { + mapperExcel.put("姓名", "name"); + mapperExcel.put("部门", "deptName"); + mapperExcel.put("身份证号", "idCardNo"); + mapperExcel.put("是否考勤(默认是)", "isKaoqin"); + mapperExcel.put("是否统计加班(默认否)", "isOt"); + mapperExcel.put("是否专务(默认否)", "isZhuanwu"); + mapperExcel.put("是否正职领导(默认否)", "isLeader"); + mapperExcel.put("年假(天)", "initAnnualLeave"); + mapperExcel.put("剩余年假(天)","annualLeave"); + } + @Value("${casic.base.personPrefix:}") private String personPrefix; @Autowired @@ -41,6 +69,11 @@ private IMetadataSupportService supportService; @Autowired private IIrisDataService irisDataService; + @Autowired + private IIrisPersonService irisPersonService; + @Autowired + private ICommonDeptService commonDeptService; + @Transactional(rollbackFor = Exception.class) @Override @@ -108,6 +141,116 @@ personService.updatePerson(person); } + + /** + * 员工导入 + * + * @param list 员工集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData personImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + List personList = new ArrayList<>(); + List deptList = commonDeptService.getDeptByTips(null); + Person person = new Person(); + //处理人员信息 + int index = 2; + try { + for (PersonAtdDTO personDto : list) { + person = new Person(); + + // 判断部门信息 + if (ToolUtil.isEmpty(personDto.getDeptName())) { + results.add("第" + index + "行,部门不能为空"); + break; + }else { + for (Dept dept : deptList) { + if (personDto.getDeptName().equals(dept.getSimplename())){ + person.setDeptid(dept.getId()); + break; + } + } + if(ToolUtil.isEmpty(person.getDeptid())){ + results.add("第" + index + "行,部门信息不正确"); + break; + } + } + + if (ToolUtil.isEmpty(personDto.getName())) { + results.add("第" + index + "行,姓名不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getIdCardNo())) { + results.add("第" + index + "行,身份证号不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getInitAnnualLeave())) { + results.add("第" + index + "行,年假天数不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getAnnualLeave())) { + results.add("第" + index + "行,剩余年假天数不能为空"); + break; + } else { + Long deptid = person.getDeptid(); + person = personDto.toPerson(); + person.setDeptid(deptid); + person.setPersonType(PersonTypeEnums.STAFF.getValue()); + person.setOprationId(permissionService.getCurrLoginUser().getId()); + // 根据身份证号得到生日和性别 + String idCardNo = personDto.getIdCardNo(); + String birth = ""; + if (idCardNo.length() == 15) birth = "19" + idCardNo.substring(6, 8)+"-"+idCardNo.substring(8,10)+"-"+idCardNo.substring(10,12); + else if (idCardNo.length() == 18) + { + birth = idCardNo.substring(6, 10)+"-"+idCardNo.substring(10,12)+"-"+idCardNo.substring(12,14); + if ((Convert.toInt(idCardNo.substring(16, 17)) % 2) == 1)//奇数 + { + person.setSex("1"); + } + else person.setSex("2"); + } + person.setBirthday(Date.valueOf(birth)); + + irisPersonService.insert(person); + } + index++; + } + } catch(DuplicateKeyException e){ + e.printStackTrace(); + GunsException gunsException = new GunsException(BizExceptionEnum.SERVER_ERROR); + gunsException.setMessage(e.getMessage().contains("ID_CARD_INDEX") ? "身份证号重复" : "人员编码重复"); + throw gunsException; + } + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List personDtoList = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapperExcel, PersonAtdDTO.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + PersonAtdDTO personDto = row.getResult(); + personDtoList.add(personDto); + } + } else { + //其他sheet停止读取 + logger.info("人员信息导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(personDtoList); + } + private void wrap(Map map) { map.put("deptName", permissionService.getDeptName((Serializable) map.get("deptid"))); if (ToolUtil.isNotEmpty(map.get(IrisPersonConst.PERSON_SEX_KEY))) { diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java new file mode 100644 index 0000000..a39eb1e --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java @@ -0,0 +1,68 @@ +package com.casic.missiles.modular.register.warpper; + + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import org.springframework.beans.factory.annotation.Value; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 人员的包装类 + * + * @date 2019年12月5日10:59:02 + */ +public class IrisPersonWarpper extends BaseControllerWarpper { + + + public IrisPersonWarpper(Object list) { + super(list); + } + ICommonPermissionService service = SpringContextHolder.getBean(ICommonPermissionService.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + @Override + public void warpTheMap(Map map) { + + Map mapExt = (Map)map.get("ext"); + //是否考勤 + if (!ToolUtil.isEmpty(mapExt.get("isKaoqin"))) { + if(mapExt.get("isKaoqin").equals("1")) { + map.put("isKaoqinName", "是"); + }else { + map.put("isKaoqinName", "否"); + } + } + //是否统计加班 + if (!ToolUtil.isEmpty(mapExt.get("isOt"))) { + if(mapExt.get("isOt").equals("1")) { + map.put("isOtName", "是"); + }else { + map.put("isOtName", "否"); + } + } + //是否专务 + if (!ToolUtil.isEmpty(mapExt.get("isZhuanwu"))) { + if(mapExt.get("isZhuanwu").equals("1")) { + map.put("isZhuanwuName", "是"); + }else { + map.put("isZhuanwuName", "否"); + } + } + //是否正职领导 + if (!ToolUtil.isEmpty(mapExt.get("isLeader"))) { + if(mapExt.get("isLeader").equals("1")) { + map.put("isLeaderName", "是"); + }else { + map.put("isLeaderName", "否"); + } + } + + + + } + +} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 464d675..71b3a85 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -122,6 +122,11 @@ casic-iris-register ${pro.version}
+ + com.casic + casic-iris-atd + ${pro.version} + org.springframework.boot diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 1423ba3..3ef2e8e 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,5 +1,6 @@ package com.casic.missiles; +import com.casic.missiles.modular.system.task.GenerateReportTask; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; @@ -10,6 +11,10 @@ import java.io.FileNotFoundException; +import java.lang.reflect.GenericArrayType; +import java.text.ParseException; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; /** * SpringBoot方式启动类 @@ -24,10 +29,13 @@ private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); - public static void main(String[] args) throws FileNotFoundException { + public static void main(String[] args) throws FileNotFoundException, ParseException { + SpringApplication.run(CasicApplication.class, args); logger.info("GunsApplication is success!"); +// GenerateReportTask task = new GenerateReportTask(); +// task.generateTask(); } } diff --git a/casic-web/src/main/resources/application.yml b/casic-web/src/main/resources/application.yml index 17b9bba..c80502c 100644 --- a/casic-web/src/main/resources/application.yml +++ b/casic-web/src/main/resources/application.yml @@ -21,4 +21,4 @@ server: tomcat: - max-http-post-size: -1 + max-http-post-size: -1 \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index ffffcff..aa5bf12 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -3,9 +3,9 @@ ################### spring配置 ################### spring: datasource: - url: jdbc:mysql://139.198.16.38:8098/casic_iris_temperature?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + url: jdbc:mysql://111.198.10.15:11102/casic_iris_temperature?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull username: root - password: Casic203 + password: Casic203! initial-size: 2 min-idle: 1 #flowable数据源和多数据源配置 @@ -18,11 +18,13 @@ recServicePort: 20004 sync: cron: "0 0 1 * * ?" #每天凌晨1点执行一次 + generate: + cron: "0 08 18 * * ?" #每天凌晨4点执行一次 jdbc: - port: 8098 + port: 11102 dbName: casic_iris_temperature userName: root - userPwd: Casic203 + userPwd: Casic203! mybatis-plus: global-config: sql-injector: com.casic.missiles.modular.metadata.inject.MetaSqlInject @@ -36,3 +38,4 @@ socket-port: 8000 config: export-path: D:\java\boot\casic-web-1.0.0-SNAPSHOT\export\ + static-location: C:\casic\tmp\ diff --git a/casic-iris-atd/pom.xml b/casic-iris-atd/pom.xml new file mode 100644 index 0000000..511129e --- /dev/null +++ b/casic-iris-atd/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.casic + casic-iris-parent + 1.0.0-SNAPSHOT + ../pom.xml + + + casic-iris-atd + ${pro.version} + jar + casic-iris-atd + 虹膜考勤系统 Attendance System + + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java new file mode 100644 index 0000000..cfa238f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java @@ -0,0 +1,94 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class ReportWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + ICommonPermissionService commonPermissionService = SpringContextHolder.getBean(ICommonPermissionService.class); + ICommonPersonService commonPersonService = SpringContextHolder.getBean(ICommonPersonService.class); + + public ReportWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + +// if (!ToolUtil.isEmpty(map.get("remarks"))) { +// String s = map.get("remarks").toString(); +// String[] arr = s.split(";"); +// s = arr[0].substring(arr[0].indexOf(":") + 1); +// if (arr.length > 1) { +// for (int i = 1; i < arr.length; i++) { +// s = s + ";" + arr[i].substring(arr[i].indexOf(":") + 1); +// } +// } +// map.put("remarks", s); +// } + + ShiroUser shiroUser = commonPermissionService .getCurrLoginUser(); + Person person = commonPersonService.getPersonById((Serializable) map.get("personId")); + Map personExt = (Map)person.getExt(); + if (shiroUser.getRoleNames().contains("人事处")) { + String isZhuanwu = Convert.toStr(personExt.get("isZhuanwu")); + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (map.get("deptName").toString().equals("人力资源处") || (isZhuanwu != null && isZhuanwu.equals("1")) || (isLeader != null && isLeader.equals("1"))) { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } else map.put("canEdit", "0"); + } else if (shiroUser.getRoleNames().contains("部门领导")) { + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (isLeader != null && isLeader.equals("1")) { + map.put("canEdit", "0"); + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + + + + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java new file mode 100644 index 0000000..be6157b --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.util.Map; + +/** + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class SpecialDayWarpper extends BaseControllerWarpper { + + public SpecialDayWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + if(!ToolUtil.isEmpty(map.get("isKaoqin"))) { + if(map.get("isKaoqin").equals("1")) map.put("isKaoqinName", "是"); + else map.put("isKaoqinName", "否"); + }else{ + map.put("isKaoqinName", ""); + } + + } + +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java index fbb3d51..0940c31 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java @@ -1,9 +1,11 @@ package com.casic.missiles.modular.register.controller; +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ErrorResponseData; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.annotion.BussinessLog; import com.casic.missiles.core.common.constant.Const; @@ -17,23 +19,30 @@ import com.casic.missiles.core.log.LogObjectHolder; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.enums.IrisExportEnum; import com.casic.missiles.modular.register.model.IrisPersonPhoto; import com.casic.missiles.modular.register.service.IIrisDataService; import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; +import com.casic.missiles.modular.register.service.impl.IrisPersonServiceImpl; import com.casic.missiles.modular.register.util.Base64Util; +import com.casic.missiles.modular.register.warpper.IrisPersonWarpper; import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.dto.PersonResDto; import com.casic.missiles.modular.system.model.Person; import com.casic.missiles.service.ICasicFileService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.SocketTimeoutException; import java.util.List; import java.util.Map; @@ -46,6 +55,7 @@ @RestController @RequestMapping("/person") public class IrisPersonController extends ExportController { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonController.class); @Autowired private ICommonPermissionService permissionService; @@ -174,6 +184,7 @@ Page> defaultPage = new PageFactory>().defaultPage(); DataScope scope = permissionService.getCurrUserDataScope(); Page> page = getPersonPage(defaultPage, keywords, sex, duty, deptid, personType, startTime, endTime, scope); + return ResponseData.success(super.packForBT(page)); } @@ -203,6 +214,7 @@ } query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); List> scopePersons = irisPersonService.selectDataScopePersonMap(defaultPage, scope, query); + new IrisPersonWarpper(scopePersons).warp(); defaultPage.setRecords(scopePersons); query.orderBy(PersonConst.TABLE_PERSONCODE); //展示数据封装 @@ -219,4 +231,30 @@ return ResponseData.success(); } } + + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + + try { + //解析文件流 + ResponseData responseData = irisPersonService.parseSourceFile(file); + //校验及保存数据 + return irisPersonService.personImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("人员信息导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java new file mode 100644 index 0000000..c2b0114 --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java @@ -0,0 +1,165 @@ +package com.casic.missiles.modular.register.dto; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Person; +import org.apache.shiro.crypto.hash.Hash; +import org.apache.xmlbeans.impl.xb.xsdschema.Public; +import org.springframework.beans.factory.annotation.Autowired; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class PersonAtdDTO { + + private Long id;//主键 + private String name;//开始日期 + private String deptName;//开始时间 + private String idCardNo;//结束日期 + private String isKaoqin;//结束时间 + private String isOt; + private String isZhuanwu;//备注信息 + private String isLeader;//备注类型 + private String initAnnualLeave; + private String annualLeave; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getIdCardNo() { + return idCardNo; + } + + public void setIdCardNo(String idCardNo) { + this.idCardNo = idCardNo; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + public String getIsZhuanwu() { + return isZhuanwu; + } + + public void setIsZhuanwu(String isZhuanwu) { + this.isZhuanwu = isZhuanwu; + } + + public String getIsLeader() { + return isLeader; + } + + public void setIsLeader(String isLeader) { + this.isLeader = isLeader; + } + + public String getInitAnnualLeave() { + return initAnnualLeave; + } + + public void setInitAnnualLeave(String initAnnualLeave) { + this.initAnnualLeave = initAnnualLeave; + } + + public String getAnnualLeave() { + return annualLeave; + } + + public void setAnnualLeave(String annualLeave) { + this.annualLeave = annualLeave; + } + + public String getIsOt() { + return isOt; + } + + public void setIsOt(String isOt) { + this.isOt = isOt; + } + + @Override + public String toString() { + return "PerosnDTO{" + + "id=" + id + + ", name='" + name + '\'' + + ", deptName='" + deptName + '\'' + + ", idCardNo='" + idCardNo + '\'' + + ", isKaoqin='" + isKaoqin + '\'' + + ", isZhuanwu='" + isZhuanwu + '\'' + + ", isLeader='" + isLeader + '\'' + + ", initAnnualLeave='" + initAnnualLeave + '\'' + + ", annualLeave='" + annualLeave + '\'' + + '}'; + } + + public Person toPerson(){ + Person person = new Person(); + try { + person.setName(this.name); + person.setIdCardNo(this.idCardNo); + person.setDelflag("0"); + + Map mapExt = new HashMap<>(); + mapExt.put("initAnnualLeave",this.initAnnualLeave); + mapExt.put("annualLeave",this.annualLeave); + if(this.isKaoqin!=null && !this.isKaoqin.equals("") && this.isKaoqin.equals("否")) + {mapExt.put("isKaoqin","0");}else mapExt.put("isKaoqin","1"); + + if(this.isOt!=null && !this.isOt.equals("") && this.isOt.equals("是")) + {mapExt.put("isOt","1");}else mapExt.put("isOt","0"); + + if(this.isZhuanwu!=null && !this.isZhuanwu.equals("") && this.isZhuanwu.equals("是")) + {mapExt.put("isZhuanwu","1");}else mapExt.put("isZhuanwu","0"); + + if(this.isLeader!=null && !this.isLeader.equals("") && this.isLeader.equals("是")) + {mapExt.put("isLeader","1");}else mapExt.put("isLeader","0"); + + person.setExt(mapExt); + + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + return person; + } +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java index 68b16a8..1c9226b 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java @@ -3,10 +3,14 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.model.IrisData; +import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.model.Person; import org.apache.ibatis.annotations.Param; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -29,4 +33,17 @@ void insert(Person person); void update(Person person); + + /** + * 特殊考勤日数据导入 + * @param list 专题库集合 + */ + ResponseData personImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java index d936cc2..1a411ca 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java @@ -2,33 +2,61 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.constant.Const; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.common.service.ICommonPersonService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.exception.GunsException; import com.casic.missiles.core.meta.annotations.MetaDataBean; +import com.casic.missiles.core.util.Convert; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; import com.casic.missiles.modular.register.constant.IrisPersonConst; import com.casic.missiles.modular.register.dao.IrisDataMapper; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; +import com.casic.missiles.modular.register.enums.PersonTypeEnums; import com.casic.missiles.modular.register.service.IIrisDataService; +import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; import com.casic.missiles.modular.system.dto.PersonDto; +import com.casic.missiles.modular.system.model.Dept; import com.casic.missiles.modular.system.model.Person; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.hswebframework.expands.office.excel.ExcelIO; +import java.io.InputStream; import java.io.Serializable; +import java.sql.Date; import java.sql.Timestamp; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Service public class IrisPersonServiceImpl implements IIrisPersonService { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonServiceImpl.class); + protected static final Map mapperExcel = new HashMap<>(); + static { + mapperExcel.put("姓名", "name"); + mapperExcel.put("部门", "deptName"); + mapperExcel.put("身份证号", "idCardNo"); + mapperExcel.put("是否考勤(默认是)", "isKaoqin"); + mapperExcel.put("是否统计加班(默认否)", "isOt"); + mapperExcel.put("是否专务(默认否)", "isZhuanwu"); + mapperExcel.put("是否正职领导(默认否)", "isLeader"); + mapperExcel.put("年假(天)", "initAnnualLeave"); + mapperExcel.put("剩余年假(天)","annualLeave"); + } + @Value("${casic.base.personPrefix:}") private String personPrefix; @Autowired @@ -41,6 +69,11 @@ private IMetadataSupportService supportService; @Autowired private IIrisDataService irisDataService; + @Autowired + private IIrisPersonService irisPersonService; + @Autowired + private ICommonDeptService commonDeptService; + @Transactional(rollbackFor = Exception.class) @Override @@ -108,6 +141,116 @@ personService.updatePerson(person); } + + /** + * 员工导入 + * + * @param list 员工集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData personImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + List personList = new ArrayList<>(); + List deptList = commonDeptService.getDeptByTips(null); + Person person = new Person(); + //处理人员信息 + int index = 2; + try { + for (PersonAtdDTO personDto : list) { + person = new Person(); + + // 判断部门信息 + if (ToolUtil.isEmpty(personDto.getDeptName())) { + results.add("第" + index + "行,部门不能为空"); + break; + }else { + for (Dept dept : deptList) { + if (personDto.getDeptName().equals(dept.getSimplename())){ + person.setDeptid(dept.getId()); + break; + } + } + if(ToolUtil.isEmpty(person.getDeptid())){ + results.add("第" + index + "行,部门信息不正确"); + break; + } + } + + if (ToolUtil.isEmpty(personDto.getName())) { + results.add("第" + index + "行,姓名不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getIdCardNo())) { + results.add("第" + index + "行,身份证号不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getInitAnnualLeave())) { + results.add("第" + index + "行,年假天数不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getAnnualLeave())) { + results.add("第" + index + "行,剩余年假天数不能为空"); + break; + } else { + Long deptid = person.getDeptid(); + person = personDto.toPerson(); + person.setDeptid(deptid); + person.setPersonType(PersonTypeEnums.STAFF.getValue()); + person.setOprationId(permissionService.getCurrLoginUser().getId()); + // 根据身份证号得到生日和性别 + String idCardNo = personDto.getIdCardNo(); + String birth = ""; + if (idCardNo.length() == 15) birth = "19" + idCardNo.substring(6, 8)+"-"+idCardNo.substring(8,10)+"-"+idCardNo.substring(10,12); + else if (idCardNo.length() == 18) + { + birth = idCardNo.substring(6, 10)+"-"+idCardNo.substring(10,12)+"-"+idCardNo.substring(12,14); + if ((Convert.toInt(idCardNo.substring(16, 17)) % 2) == 1)//奇数 + { + person.setSex("1"); + } + else person.setSex("2"); + } + person.setBirthday(Date.valueOf(birth)); + + irisPersonService.insert(person); + } + index++; + } + } catch(DuplicateKeyException e){ + e.printStackTrace(); + GunsException gunsException = new GunsException(BizExceptionEnum.SERVER_ERROR); + gunsException.setMessage(e.getMessage().contains("ID_CARD_INDEX") ? "身份证号重复" : "人员编码重复"); + throw gunsException; + } + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List personDtoList = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapperExcel, PersonAtdDTO.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + PersonAtdDTO personDto = row.getResult(); + personDtoList.add(personDto); + } + } else { + //其他sheet停止读取 + logger.info("人员信息导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(personDtoList); + } + private void wrap(Map map) { map.put("deptName", permissionService.getDeptName((Serializable) map.get("deptid"))); if (ToolUtil.isNotEmpty(map.get(IrisPersonConst.PERSON_SEX_KEY))) { diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java new file mode 100644 index 0000000..a39eb1e --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java @@ -0,0 +1,68 @@ +package com.casic.missiles.modular.register.warpper; + + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import org.springframework.beans.factory.annotation.Value; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 人员的包装类 + * + * @date 2019年12月5日10:59:02 + */ +public class IrisPersonWarpper extends BaseControllerWarpper { + + + public IrisPersonWarpper(Object list) { + super(list); + } + ICommonPermissionService service = SpringContextHolder.getBean(ICommonPermissionService.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + @Override + public void warpTheMap(Map map) { + + Map mapExt = (Map)map.get("ext"); + //是否考勤 + if (!ToolUtil.isEmpty(mapExt.get("isKaoqin"))) { + if(mapExt.get("isKaoqin").equals("1")) { + map.put("isKaoqinName", "是"); + }else { + map.put("isKaoqinName", "否"); + } + } + //是否统计加班 + if (!ToolUtil.isEmpty(mapExt.get("isOt"))) { + if(mapExt.get("isOt").equals("1")) { + map.put("isOtName", "是"); + }else { + map.put("isOtName", "否"); + } + } + //是否专务 + if (!ToolUtil.isEmpty(mapExt.get("isZhuanwu"))) { + if(mapExt.get("isZhuanwu").equals("1")) { + map.put("isZhuanwuName", "是"); + }else { + map.put("isZhuanwuName", "否"); + } + } + //是否正职领导 + if (!ToolUtil.isEmpty(mapExt.get("isLeader"))) { + if(mapExt.get("isLeader").equals("1")) { + map.put("isLeaderName", "是"); + }else { + map.put("isLeaderName", "否"); + } + } + + + + } + +} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 464d675..71b3a85 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -122,6 +122,11 @@ casic-iris-register ${pro.version}
+ + com.casic + casic-iris-atd + ${pro.version} + org.springframework.boot diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 1423ba3..3ef2e8e 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,5 +1,6 @@ package com.casic.missiles; +import com.casic.missiles.modular.system.task.GenerateReportTask; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; @@ -10,6 +11,10 @@ import java.io.FileNotFoundException; +import java.lang.reflect.GenericArrayType; +import java.text.ParseException; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; /** * SpringBoot方式启动类 @@ -24,10 +29,13 @@ private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); - public static void main(String[] args) throws FileNotFoundException { + public static void main(String[] args) throws FileNotFoundException, ParseException { + SpringApplication.run(CasicApplication.class, args); logger.info("GunsApplication is success!"); +// GenerateReportTask task = new GenerateReportTask(); +// task.generateTask(); } } diff --git a/casic-web/src/main/resources/application.yml b/casic-web/src/main/resources/application.yml index 17b9bba..c80502c 100644 --- a/casic-web/src/main/resources/application.yml +++ b/casic-web/src/main/resources/application.yml @@ -21,4 +21,4 @@ server: tomcat: - max-http-post-size: -1 + max-http-post-size: -1 \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index ffffcff..aa5bf12 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -3,9 +3,9 @@ ################### spring配置 ################### spring: datasource: - url: jdbc:mysql://139.198.16.38:8098/casic_iris_temperature?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + url: jdbc:mysql://111.198.10.15:11102/casic_iris_temperature?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull username: root - password: Casic203 + password: Casic203! initial-size: 2 min-idle: 1 #flowable数据源和多数据源配置 @@ -18,11 +18,13 @@ recServicePort: 20004 sync: cron: "0 0 1 * * ?" #每天凌晨1点执行一次 + generate: + cron: "0 08 18 * * ?" #每天凌晨4点执行一次 jdbc: - port: 8098 + port: 11102 dbName: casic_iris_temperature userName: root - userPwd: Casic203 + userPwd: Casic203! mybatis-plus: global-config: sql-injector: com.casic.missiles.modular.metadata.inject.MetaSqlInject @@ -36,3 +38,4 @@ socket-port: 8000 config: export-path: D:\java\boot\casic-web-1.0.0-SNAPSHOT\export\ + static-location: C:\casic\tmp\ diff --git a/casic-web/src/main/resources/ehcache.xml b/casic-web/src/main/resources/ehcache.xml index 78c82d8..6a2c583 100644 --- a/casic-web/src/main/resources/ehcache.xml +++ b/casic-web/src/main/resources/ehcache.xml @@ -53,6 +53,19 @@ memoryStoreEvictionPolicy="LFU" transactionalMode="off"> + + + + com.casic + casic-core + ${casic.version} + + + com.casic + casic-expands-office + 1.0.0-SNAPSHOT + + + com.casic + casic-export-support + 1.0.0-SNAPSHOT + + + + + com.casic + casic-iris-support + ${casic.version} + + + com.casic + casic-metadata-support + ${casic.version} + + + com.casic + casic-export-support + ${casic.version} + + + com.casic + casic-file-support + ${casic.version} + + + + + + + + src/main/java + + **/*.xml + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java new file mode 100644 index 0000000..d413cbd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/AtdRulesController.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import com.casic.missiles.modular.system.warpper.AtdRulesWarpper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-12-09 14:23:59 + */ +@Controller +@RequestMapping("/AtdRules") +public class AtdRulesController extends BaseController { + + + @Autowired + private IAtdRulesService AtdRulesService; + + + + /** + * 获取考勤规则 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list() { + List> results = AtdRulesService.list(); + new AtdRulesWarpper(results).warp(); + return ResponseData.success(results.get(0)); + } + + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(AtdRules AtdRules) { + AtdRules.setAdvanceEnd(AtdRules.getDelayBegin1()); + AtdRulesService.updateById(AtdRules); + return ResponseData.success(); + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{AtdRulesId}") + @ResponseBody + public Object detail(@PathVariable("AtdRulesId") Integer AtdRulesId) { + return AtdRulesService.selectById(AtdRulesId); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java new file mode 100644 index 0000000..d0a9ff1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/MakeReportController.java @@ -0,0 +1,942 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.enums.AtdExportEnum; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-14 11:30:06 + */ +@Controller +@RequestMapping("/makeReport") +public class MakeReportController extends ExportController { + + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + static String beginDate=""; + static String endDate=""; + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonDeptService commonDeptService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IAtdRulesService atdRulesService; + + @Autowired + private IRecRecordService recRecordService; + + @Autowired + private IAtdPersonService atdPersonService; + + @Autowired + private IGenerateReportService generateReportService; + + + /** + * 生成考勤报表 + */ + @GetMapping(value = "/make") + @ResponseBody + public Object make(String month, HttpServletResponse response) throws IOException { + + if(month!=null && month!="") + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + + XSSFWorkbook wb = generateUnusual(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("部门领导")) wb = generateOt(wb); + + + String fileName = "report"+beginDate.replaceAll("-","") +"-"+endDate.replaceAll("-","")+".xlsx"; + + try { + OutputStream output = response.getOutputStream(); + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=".concat(fileName)); + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Allow-Origin","*"); + wb.write(output); + output.flush(); + output.close(); + } + catch (Exception e) + { + return ResponseData.error("文件加载出错"); + } + + return ResponseData.success(); + } + + + private XSSFWorkbook generateOt(XSSFWorkbook wb) throws IOException { + + wb.createSheet("聘工加班情况"); + wb.createSheet("聘工加班统计"); + XSSFSheet sheet1 = wb.getSheet("聘工加班情况"); + XSSFSheet sheet2 = wb.getSheet("聘工加班统计"); + + sheet1.createRow(0); + sheet1.getRow(0).createCell(0).setCellValue("部门"); + sheet1.getRow(0).createCell(1).setCellValue("姓名"); + sheet1.getRow(0).createCell(2).setCellValue("日期"); + sheet1.getRow(0).createCell(3).setCellValue("识别记录"); + sheet1.getRow(0).createCell(4).setCellValue("加班时长(m)"); + + sheet2.createRow(0); + sheet2.getRow(0).createCell(0).setCellValue("部门"); + sheet2.getRow(0).createCell(1).setCellValue("姓名"); + sheet2.getRow(0).createCell(2).setCellValue("加班总时长(h)"); + + List> otReportList = otReportService.selectByOtYes(beginDate,endDate); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + try { + String nameFirst = ""; + String deptFirst=""; + int totalMinute = 0; + List> summaryList = new ArrayList<>(); + Map mSummary = new HashMap<>(); + + //填充 + int i = 1; + int j = 1; + int index = 0; + for (Map map :otReportList) { + index++; + //填写sheet1 + XSSFRow row = sheet1.createRow(i); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + row.createCell(2).setCellValue(map.get("date").toString()); + row.createCell(3).setCellValue(map.get("rec_time").toString()); + row.createCell(4).setCellValue(map.get("ot_minute").toString()); + i++; + + if(nameFirst.equals("")){ + deptFirst = map.get("dept").toString(); + nameFirst = map.get("name").toString(); + totalMinute = 0; + } + else{ + if(!nameFirst.equals(map.get("name").toString())){ + //填写sheet2 + XSSFRow row2 = sheet2.createRow(j); + row2.createCell(0).setCellValue(deptFirst); + row2.createCell(1).setCellValue(nameFirst); + row2.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + + totalMinute = 0; + nameFirst = map.get("name").toString(); + deptFirst = map.get("dept").toString(); + j++; + } + } + + totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + + if(index == otReportList.size()){ + XSSFRow row3 = sheet2.createRow(j); + row3.createCell(0).setCellValue(map.get("dept").toString()); + row3.createCell(1).setCellValue(map.get("name").toString()); + //totalMinute = totalMinute + Convert.toInt(map.get("ot_minute").toString()); + row3.createCell(2).setCellValue(df.format((float) totalMinute / 60)); + } + } + + }catch (Exception e){ + e.printStackTrace(); + } + + + return wb; + } + + + private XSSFWorkbook generateUnusual ()throws IOException { + + DecimalFormat doublef = new DecimalFormat("0.0");//设置保留位数 + + List deptList= new ArrayList(); + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(shiroUser.getRoleNames().contains("部门领导")) { + Dept dept = new Dept(); + dept.setSimplename(shiroUser.getDeptName()); + dept.setId(shiroUser.getDeptId()); + deptList.add(dept); + } + else + { + deptList = commonDeptService.getDeptByTips(null); + deptList.remove(0); + } + + XSSFWorkbook workbook = workbookReady(deptList); //准备异常报表格式 + XSSFSheet sheetkqhz = workbook.getSheet("考勤汇总"); + XSSFSheet sheettjsj = workbook.getSheet("统计数据"); + XSSFSheet sheetjlhz = workbook.getSheet("原始识别记录"); + + + List> kqhzList = new ArrayList<>(); + List> tjsjList = new ArrayList<>(); + + CellStyle notesStyleG = workbook.createCellStyle(); + notesStyleG.setWrapText(true); + + CellStyle notesStyleR = workbook.createCellStyle(); + notesStyleR.setWrapText(true); + notesStyleR.setFillForegroundColor(IndexedColors.CORAL.getIndex()); + notesStyleR.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + //读取工作日信息 + List atdRulesList = atdRulesService.selectList(null); + AtdRules atdRules = atdRulesList.get(0); + String workDays = atdRules.getWorkDay(); + + // 读取上下班时间,用于判断识别记录是正常还是异常 + ReportRules reportRules = generateReportService.getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); // 13:45:20 + LocalTime xiaban = reportRules.getXiaban(); // 13:45:20 + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + // 起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; + + int kaoQinYes=0; // 存储考勤日天数 + int kaoQinNo=0; // 存储非考勤日天数 + //读取调休信息 + LocalDate beginDateTX = LocalDate.parse(beginDate,fomatter); + for(int t=0;t> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + //取出当前部门的数据,据此生成报表 + List> reportList = reportService.searchReportList(page, mDept.getId()+"","","",beginDate,endDate,"","true"); + Collections.sort(reportList,new Comparator>() { + public int compare(Map o1, Map o2) { + return o1.get("name").toString().compareTo(o2.get("name").toString()); + } + }); + + List> staffList = new ArrayList<>(); + staffList = atdPersonService.getPersonListByDeptId(mDept.getId());// 当前部门的员工名单 + //删除设置为不考勤的员工 + for(Map map: staffList){ + if(!(((Map)map.get("ext")).get("isKaoqin").toString().equals("1"))){ + staffList.remove(map); + } + } + + int ycqCount = staffList.size(); // 当前部门应出勤人数 + int ycqDays = ycqCount * GetWorkDays(kaoQinYes,kaoQinNo,workDays);// 当前部门应出勤天数 + + double totalKGHours = 0.0; // 某部门缺勤总小时数,请假、旷工 + double totalKGMinuts = 0.0; //某部门缺勤总分钟数,迟到、早退 + + int cdNum = 0; + int ztNum = 0; + Double kgHour = 0.0; //某员工缺勤小时数 + Double nianjia = 00.0; + Double bingjia = 0.0; + Double shijia = 0.0; + Double tanqinjia = 0.0; + Double hunjia = 0.0; + Double shengyujia = 0.0; + Double sangjia = 0.0; + Double gongshang = 0.0; + + String nameFirst =""; + Map mkqhz = new HashMap<>(); + int pp=0; + for(int i = 0; i< reportList.size();i++) { + pp++; + Map mReport = reportList.get(i); + String currentDate = mReport.get("date").toString(); + + LocalDate currentDateDate = LocalDate.parse(currentDate,df); + + SpecialDay curSpecialDay = specialDayService.isDateExist(currentDate,currentDate); + + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + if((currentDateDate.getDayOfWeek() == DayOfWeek.SATURDAY || currentDateDate.getDayOfWeek() == DayOfWeek.SUNDAY) && curSpecialDay==null) + { + reportList.remove(i); + i--; + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if(curSpecialDay!=null && curSpecialDay.getIsKaoqin().equals("0")) { + reportList.remove(i); + i--; + continue; + } + + if (nameFirst.equals("")) { + nameFirst = mReport.get("name").toString(); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + } else { + if (!nameFirst.equals(mReport.get("name").toString())) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + kqhzList.add(mkqhz); + } + + mkqhz = new HashMap<>(); + nameFirst = mReport.get("name").toString(); + + mkqhz.put("dept", currentDept); + mkqhz.put("name", mReport.get("name").toString()); + + cdNum = 0; + ztNum = 0; + kgHour = 0.0; + nianjia = 0.0; + bingjia = 0.0; + shijia = 0.0; + tanqinjia = 0.0; + hunjia = 0.0; + shengyujia = 0.0; + sangjia = 0.0; + gongshang = 0.0; + } + } + + String remarksInfo = ""; + if(mReport.get("remarks") != null)remarksInfo = mReport.get("remarks").toString(); + + if (!mReport.get("late").toString().equals("—") ) + { + double minuts = Convert.toDouble(mReport.get("late").toString()); + + if (remarksInfo.contains("迟到") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("迟到:出差")&&!remarksInfo.contains("迟到:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + cdNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("early").toString().equals("—")) + { + double minuts = Convert.toDouble(mReport.get("early").toString()); + + if (remarksInfo.contains("早退")|| remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("早退:出差")&&!remarksInfo.contains("早退:(公)")) { + totalKGMinuts = totalKGMinuts + minuts; + } + } + else { + ztNum++; + totalKGMinuts = totalKGMinuts + minuts; + } + } + if (!mReport.get("absentAm").toString().equals("—")) + { + double absentAmHour = Convert.toDouble(mReport.get("absentAm").toString()); + if (remarksInfo.contains("上午旷工") || remarksInfo.contains("晚到减免")){ + if(!remarksInfo.contains("上午旷工:出差")&&!remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += absentAmHour; + } + + if(!remarksInfo.contains("上午旷工")){ + if (remarksInfo.contains("晚到减免")) { + if (absentAmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentAmHour -= 1; + kgHour += absentAmHour; + } else { //减去哺乳假1小时后迟到 + cdNum++; + } + } + } + } + else { + kgHour = kgHour + absentAmHour; + totalKGHours += absentAmHour; + } + } + + if (!mReport.get("absentPm").toString().equals("—")) + { + double absentPmHour = Convert.toDouble(mReport.get("absentPm").toString()); + if (remarksInfo.contains("下午旷工") || remarksInfo.contains("早走减免")){ + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += absentPmHour; + } + + if(!remarksInfo.contains("下午旷工")) { + if (remarksInfo.contains("早走减免")) { + if (absentPmHour - 1 >= 1) {//减去哺乳假1小时后仍然旷工 + absentPmHour -= 1; + kgHour += absentPmHour; + } else ztNum++; //减去哺乳假1小时后早退 + } + } + } + else { + kgHour = kgHour + absentPmHour; + totalKGHours += absentPmHour; + } + } + if (!mReport.get("absentOneDay").toString().equals("—")) { + double kghour1 = 3.5; + double kghour2 = 4.5; + if(!remarksInfo.equals("")){ + if (remarksInfo.contains("旷工1天")) { + if (remarksInfo.contains("旷工1天:出差")||remarksInfo.contains("旷工1天:(公)")) { + }else { + totalKGHours += 8.0; + } + } + //只备注了上午旷工 + else if (remarksInfo.contains("上午旷工")&&!remarksInfo.contains("下午旷工")) { + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + totalKGHours += kghour2; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("早走减免"))kgHour += 3.5; + else kgHour += 4.5; + } + //只备注了下午旷工 + else if(!remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + }else { + totalKGHours += 8.0; + } + + if(remarksInfo.contains("晚到减免"))kgHour += 2.5; + else kgHour += 3.5; + } + //同时备注了上午旷工和下午旷工 + else if(remarksInfo.contains("上午旷工")&&remarksInfo.contains("下午旷工")){ + if(remarksInfo.contains("上午旷工:出差")||remarksInfo.contains("上午旷工:(公)")) { + if(!remarksInfo.contains("下午旷工:出差")&&!remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour2; + } + }else { + if(remarksInfo.contains("下午旷工:出差")||remarksInfo.contains("下午旷工:(公)")) { + totalKGHours += kghour1; + } + else { + totalKGHours += 8.0; + } + } + + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + }else { + totalKGHours += 8.0; + if(remarksInfo.contains("晚到减免")||remarksInfo.contains("早走减免"))kgHour += 7.0; + } + }else { + kgHour += 8.0; + totalKGHours += 8.0; + } + } + + if (remarksInfo.contains("请假-年假")){ + if(mReport.get("absentOneDay").toString().equals("√") && remarksInfo.contains("旷工1天"))nianjia++; + else nianjia=nianjia+0.5; + } + else if (remarksInfo.contains("请假-病假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))bingjia++; + else bingjia=bingjia+0.5; + } + else if (remarksInfo.contains("请假-事假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shijia++; + else shijia=shijia+0.5; + } + else if (remarksInfo.contains("请假-探亲假")) { + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))tanqinjia++; + else tanqinjia=tanqinjia+0.5; + } + else if (remarksInfo.contains("请假-婚假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))hunjia++; + else hunjia= hunjia+0.5; + } + else if (remarksInfo.contains("请假-生育假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))shengyujia++; + else shengyujia= shengyujia+0.5; + } + else if (remarksInfo.contains("请假-丧假")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))sangjia++; + else sangjia= sangjia+0.5; + } + else if (remarksInfo.contains("请假-工伤")){ + if(mReport.get("absentOneDay").toString().equals("√")&& remarksInfo.contains("旷工1天"))gongshang++; + else gongshang= gongshang+0.5; + } + + if( pp == reportList.size()){ + //只统计有情况的数据 + if(cdNum!=0 || ztNum!=0 || kgHour!=0.0 || nianjia!=0.0 || bingjia!=0.0 || shijia!=0.0 || tanqinjia!=0.0 ||hunjia!=0.0 || shengyujia!=0.0||sangjia!=0.0||gongshang!=0.0) { + mkqhz.put("late", cdNum + ""); + mkqhz.put("early", ztNum + ""); + mkqhz.put("absentHour", doublef.format(kgHour)); + mkqhz.put("nianjia", nianjia + ""); + mkqhz.put("bingjia", bingjia + ""); + mkqhz.put("shijia", shijia + ""); + mkqhz.put("tanqinjia", tanqinjia + ""); + mkqhz.put("hunjia", hunjia + ""); + mkqhz.put("shengyujia", shengyujia + ""); + mkqhz.put("sangjia", sangjia + ""); + mkqhz.put("gongshang", gongshang + ""); + + kqhzList.add(mkqhz); + } + } + } // 处理完一个部门的报表数据 + + //统计数据 + Map mtjsj = new HashMap<>(); + mtjsj.put("dept",currentDept); + mtjsj.put("ycqcount",ycqCount+""); + mtjsj.put("ycqdays",ycqDays+""); + + //计算缺勤天数,所有迟到、早退、请假、旷工,不含出差 + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + String totalKGDays = df.format((totalKGHours + totalKGMinuts / 60)/8); + mtjsj.put("kgdays",totalKGDays+""); + //计算出勤率 + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(0);//设置保留小数位 + nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式 + double rate = Convert.toDouble(1) - Convert.toDouble(totalKGDays) / Convert.toDouble(ycqDays); + String cqlPercent = nf.format(rate); + mtjsj.put("cql",cqlPercent); + + tjsjList.add(mtjsj); + + //填写当前部门的详细报表数据页 + XSSFSheet sheetDept = workbook.getSheet(currentDept); + writeSheetDept(reportList,sheetDept,3); + + + //填写原始识别记录汇总表 + List> recordList = recRecordService.selectRecordByDeptId(mDept.getId()+"",beginDate,endDate); + for(Map mStaff:staffList) { + String id = mStaff.get("id").toString(); + sheetjlhz.createRow(addjlhz); + + sheetjlhz.getRow(addjlhz).createCell(0).setCellValue(currentDept); + sheetjlhz.getRow(addjlhz).createCell(1).setCellValue(mStaff.get("name").toString()); + + for(int d = 2;d record = null; + +// for (Map mRecord : recordList) { +// if(mRecord.get("id").toString().equals(id) && mRecord.get("datetime").toString().substring(0,10).equals(currentDate)) +// { +// record=mRecord; +// break; +// } +// } + String recordStr = generateReportService.getRecTime(recordList,mStaff.get("id")+"",currentDate ); + if(recordStr.equals("")) + { + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue("无记录"); + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + else { + String[] arr = recordStr.split(","); + + StringBuilder b = new StringBuilder(); + for (int f = 0; f < arr.length; f++) + { + if (f == arr.length - 1)b.append(arr[f]); + else b.append(arr[f] + "\r\n"); + } + sheetjlhz.getRow(addjlhz).createCell(d).setCellValue(b.toString()); + + //选取最多两次识别记录 + arr = recordsWarpper(recordStr).split(","); + LocalTime t1=null; + LocalTime t2=null; + if(arr.length==2){ + if(arr[0].length() == 5 && arr[1].length() == 5) { + int h,m,s; + h = Convert.toInt(arr[0].substring(0, 2)); + m = Convert.toInt(arr[0].substring(3, 5)); + s = 00; + t1 = LocalTime.of(h, m, s); + + h = Convert.toInt(arr[1].substring(0,2)); + m = Convert.toInt(arr[1].substring(3,5)); + s = 00; + t2 = LocalTime.of(h,m,s); + + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) + {sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleG);} + else sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + else { + sheetjlhz.getRow(addjlhz).getCell(d).setCellStyle(notesStyleR); + } + } + } + + addjlhz++; + } + + + } //处理完所有报表数据 + + writeSheetkqhz(kqhzList,sheetkqhz,2); + writeSheettjsj(tjsjList,sheettjsj,2); + + return workbook; + + } + + + private void writeSheetDept(List> list, XSSFSheet sheetDept, int startRowIndex){ + try { + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetDept.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("name").toString()); + row.createCell(1).setCellValue(map.get("date").toString()); + row.createCell(2).setCellValue(map.get("time").toString()); + row.createCell(3).setCellValue(map.get("late").toString()); + row.createCell(4).setCellValue(map.get("early").toString()); + row.createCell(5).setCellValue(map.get("absentAm").toString()); + row.createCell(6).setCellValue(map.get("absentPm").toString()); + row.createCell(7).setCellValue(map.get("absentOneDay").toString()); + if(!ToolUtil.isEmpty(map.get("remarks"))) { + String s = map.get("remarks").toString(); + String[] arr = s.split(";"); + s = arr[0].substring(arr[0].indexOf(":") + 1); + if (arr.length > 1) { + for (int j = 1; j < arr.length; j++) { + s = s + ";" + arr[j].substring(arr[j].indexOf(":") + 1); + } + } + row.createCell(8).setCellValue(s); + } + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheetkqhz(List> list, XSSFSheet sheetkqhz, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheetkqhz.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("name").toString()); + if(map.get("late") !=null)row.createCell(2).setCellValue(map.get("late").toString()); + if(map.get("early") !=null)row.createCell(3).setCellValue(map.get("early").toString()); + if(map.get("absentHour") !=null)row.createCell(4).setCellValue(map.get("absentHour").toString()); + if(map.get("nianjia") !=null)row.createCell(5).setCellValue(map.get("nianjia").toString()); + if(map.get("bingjia") !=null)row.createCell(6).setCellValue(map.get("bingjia").toString()); + if(map.get("shijia") !=null)row.createCell(7).setCellValue(map.get("shijia").toString()); + if(map.get("tanqinjia") !=null)row.createCell(8).setCellValue(map.get("tanqinjia").toString()); + if(map.get("hunjia") !=null)row.createCell(9).setCellValue(map.get("hunjia").toString()); + if(map.get("shengyujia") !=null)row.createCell(10).setCellValue(map.get("shengyujia").toString()); + if(map.get("sangjia") !=null)row.createCell(11).setCellValue(map.get("sangjia").toString()); + if(map.get("gongshang") !=null)row.createCell(12).setCellValue(map.get("gongshang").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + private void writeSheettjsj(List> list, XSSFSheet sheettjsj, int startRowIndex) + { + try { + + //填充数据的内容i表示行,z表示数据库某表的数据大小,这里使用它作为遍历条件 + int i = startRowIndex, z = 0; + while (z < list.size()) { + XSSFRow row = sheettjsj.createRow(i); + Map map = list.get(z); + row.createCell(0).setCellValue(map.get("dept").toString()); + row.createCell(1).setCellValue(map.get("ycqcount").toString()); + row.createCell(2).setCellValue(map.get("ycqdays").toString()); + row.createCell(3).setCellValue(map.get("kgdays").toString()); + row.createCell(4).setCellValue(map.get("cql").toString()); + z++; + i++; + } + + }catch (Exception e){ + e.printStackTrace(); + } + } + + public int GetWorkDays(int plus,int minus, String workDays) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate beginDateDate = LocalDate.parse(beginDate,fomatter); + LocalDate endDateDate = LocalDate.parse(endDate,fomatter); + + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1; + + // 休息天数 + int weekDays = 0; + + for (int i = 1; i < days; i++) + { + String w = beginDateDate.getDayOfWeek().getValue()+1+""; + // 判断是否为周六,周日,是则记录天数。 + if(!workDays.contains(w))weekDays++; + + beginDateDate = beginDateDate.plusDays(1); + } + // 工作日 + return (int)(days - weekDays + plus-minus); + + } + + + public XSSFWorkbook workbookReady(List dept_names) throws IOException { + String path = AtdExportEnum.MAKE_REPORT_EXPORT.getFileTempPath(); + InputStream is = new FileInputStream(path); + XSSFWorkbook workbook = new XSSFWorkbook(is); + + String cyc = "("+beginDate.replace("-","")+"-"+endDate.replace("-","")+")"; + String title = workbook.getSheet("考勤汇总").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("考勤汇总").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("统计数据").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("统计数据").getRow(0).getCell(0).setCellValue(title); + + title = workbook.getSheet("原始识别记录").getRow(0).getCell(0).getStringCellValue() + cyc; + workbook.getSheet("原始识别记录").getRow(0).getCell(0).setCellValue(title); + + int index = 0; + title=""; + for (Dept m : dept_names) + { + String name=m.getSimplename(); + if(index == 0) + { + workbook.setSheetName(0, name); + title = workbook.getSheet(name).getRow(0).getCell(0).getStringCellValue(); + } + else + { + workbook.cloneSheet(0,name); + workbook.setSheetOrder(name, index); + } + String title_final = name + title + cyc; + workbook.getSheet(name).getRow(0).getCell(0).setCellValue(title_final); + + index++; + + } + +// FileOutputStream fo = new FileOutputStream(desPath); // 输出到文件 +// workbook.write(fo); +// fo.close(); + + return workbook; + } + + + public String getWeekCHN(String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate Date = LocalDate.parse(date,fomatter); + DayOfWeek week = Date.getDayOfWeek(); + String re=""; + if(week == DayOfWeek.MONDAY) re = "一"; + else if(week == DayOfWeek.TUESDAY) re = "二"; + else if(week == DayOfWeek.WEDNESDAY) re = "三"; + else if(week == DayOfWeek.THURSDAY) re = "四"; + else if(week == DayOfWeek.FRIDAY) re = "五"; + else if(week == DayOfWeek.SATURDAY) re = "六"; + else if(week == DayOfWeek.SUNDAY) re = "日"; + + return re; + } + + /** + * 处理某员工的识别记录,包括去重、排序、取首尾记录 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + // 选取最多2次识别记录 + if (newArr.length > 2) { + recTimeWarppered = newArr[0] + "," + newArr[newArr.length - 1]; + } else recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java new file mode 100644 index 0000000..75b43da --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/RemarksController.java @@ -0,0 +1,442 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.modular.system.dto.RemarksDTO; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.model.Report; +//import com.casic.missiles.modular.system.service.IPersonService; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import com.casic.missiles.modular.system.service.IRemarksService; +import com.casic.missiles.modular.system.service.IReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 备注控制器 + * + * @author fengshuonan + * @Date 2019-03-14 10:22:39 + */ +@RestController +@RequestMapping("/remarks") +public class RemarksController extends BaseController { + + @Autowired + private IRemarksService remarksService; + + @Autowired + private IReportService reportService; + + @Autowired + private ICommonPersonService commonPersonService; + + @Autowired + private ICommonPermissionService permissionService; + + @Autowired + private IAtdPersonService personService; + + /** + * 获取已存在的备注列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String personId,String date) { + //根据personid 和日期查找相关备注 + List> result = remarksService.selectByPersonIdAndDate(personId,date); + Person person = commonPersonService.getPersonById(personId); + + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + List> re = reportService.searchReportList(page,person.getDeptid()+"",person.getName(),"",date,date,"","true"); + Map mDel = new HashMap<>(); + boolean del= true; + for(Map m : result){ + String remarks= m.get("remarks").toString();//已存在的备注类型 + if(remarks.contains("请假-哺乳假")) { + for (Map m2 : re) { + if(m2.get("remarks")!=null) { + if (m2.get("remarks").toString().contains("请假-哺乳假")) { + del = false; + break; + } + } + } + if(del){ + mDel=m; + } + } + } + + if(del)result.remove(mDel); + for(Map map : result){ + String remarksType = map.get("remarksType").toString(); + String remarksTypeName = getType(remarksType).replace(":",""); + map.put("remarksTypeName",remarksTypeName); + } + + return ResponseData.success(result); + } + /** + * 获取备注类型下拉框列表 + */ + @RequestMapping(value = "/typeList") + @ResponseBody + public Object typeList() { + RemarksType[] result = remarksService.typeList(); + return ResponseData.success(result); + } + + + /** + * 获取可以备注的类型 + */ + @RequestMapping(value = "/enabledTypeList") + @ResponseBody + public Object enabledTypeList(String personId,String reportId,String date) { + + List> result = new ArrayList<>(); + Map map = new HashMap<>(); + + // 根据reportid获取report + Report report = reportService.selectById(reportId); + boolean isAbsentOneDay =false; + if(!report.getLate().equals("—")) { + map.put("id","1"); + map.put("name","迟到"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getEarly().equals("—")){ + map.put("id","2"); + map.put("name","早退"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentAm().equals("—")){ + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentPm().equals("—")){ + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + map = new HashMap<>(); + } + if(!report.getAbsentOneDay().equals("—")){ + isAbsentOneDay =true; + + map.put("id","5"); + map.put("name","旷工一天"); + result.add(map); + + map = new HashMap<>(); + map.put("id","3"); + map.put("name","上午旷工"); + result.add(map); + map = new HashMap<>(); + map.put("id","4"); + map.put("name","下午旷工"); + result.add(map); + } + + //可以备注的类型,除去已经备注过的类型 + List> existTypeList = remarksService.selectByPersonIdAndDate(personId,date); + for(Map m : existTypeList){ + String existType = m.get("remarksType").toString();//已存在的备注类型 + for(Map m2 : result) { + if(m2.containsValue(existType)){ + result.remove(m2); + break; + } + } + } + + //因为旷工一天时,可以添加上午旷工或下午旷工,所以需要特别处理 + if(isAbsentOneDay && result.size()<3){ + boolean clear =true; + for(Map m2 : result){ + if(m2.containsValue("5")){ + result.remove(m2); + clear=false; + break; + } + } + if(clear)result.clear(); + } + + return ResponseData.success(result); + } + + + /** + * 新增 + */ + @RequestMapping(value = "/add") + @ResponseBody + public Object add(RemarksDTO remarksDTO) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + if(remarksDTO.getRemarks().contains("哺乳假1")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("6");} + else if(remarksDTO.getRemarks().contains("哺乳假2")){remarksDTO.setRemarks("请假-哺乳假");remarksDTO.setRemarksType("7");} + + Long personId = remarksDTO.getPersonId(); + + String beginDate = remarksDTO.getBeginDate(); + String endDate = remarksDTO.getEndDate(); + String remarksType = remarksDTO.getRemarksType(); + Person person = commonPersonService.getPersonById(personId); + Map personExt = (Map)person.getExt(); + + //将起止日期转换为日期格式 + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate; + if(remarksDTO.getRemarks().contains("哺乳假")){ + //如果添加哺乳假备注,则计算截止日期为1年后 + endDateDate = beginDateDate.plusYears(1); + endDate = fomatter.format(endDateDate); + remarksDTO.setEndDate(endDate); + } + endDateDate = LocalDate.parse(endDate,fomatter); + + //检查是否重复添加 + if(remarksService.selectByAllInfo(personId+"",beginDate,endDate,remarksType).size()>0) + { + return ResponseData.error("已存在相关备注"); + } + + //如果是旷工一天备注,检查被添加日期是不是真的旷工一天,如果是旷工一天,进一步判断是否已添加上午旷工或者下午旷工 + if(remarksType.equals("5")) + { + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS)+1 ; //计算起止日期相差的天数 + for(int d=0;d> absentOneDay = reportService.selectAbsentOneDayByIdAndDate(personId+"",currentDate); + if(!absentOneDay.isEmpty()){ + if(!absentOneDay.get(0).get("absentOneDay").toString().equals("√")){ + return ResponseData.error("该员工 "+currentDate + " 没有旷工一天!"); + } + } + } + } + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + + //检查权限 + if(shiroUser.getRoleNames().contains("人事处")) + { + boolean isL = false; + boolean isZ = false; + + if(personExt.get("isLeader")!=null && personExt.get("isLeader").toString().equals("1"))isL = true; + if(personExt.get("isZhuanwu")!=null && personExt.get("isZhuanwu").toString().equals("1"))isZ=true; + if(isL || isZ || permissionService.getDeptById(person.getDeptid()).getSimplename().equals("人力资源处")){} + else return ResponseData.error("无权限"); + } + else if(shiroUser.getRoleNames().contains("所领导")) + {return ResponseData.error("无权限");} + + //检查年假天数 + if(remarksDTO.getRemarks().contains("年假")) { + double days = 0.0; + if (remarksType.equals("5")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + days = begin.until(end, ChronoUnit.DAYS) + 1; + } else if (remarksType.equals("3") || remarksType.equals("4")) { + days = 0.5; + } + double d = Convert.toDouble(personExt.get("annualLeave")); + if (d < days) + return ResponseData.error("该员工年假仅剩" + personExt.get("annualLeave") + "天"); + else { + personExt.put("annualLeave", Convert.toStr(d - days)); + personService.update(person); + } + } + + Remarks remarks = remarksDTO.toRemarks(); + remarksService.insert(remarks); + + + String type=getType(remarksType);//转换备注类型为文字 + String begin =sdf.format(remarks.getBeginDate()); + String end =sdf.format(remarks.getEndDate()); + if(remarks.getRemarksType().equals("5") ){ + reportService.updateRemarksByIdAndDate(remarks.getPersonId()+"",begin,end,type + remarks.getRemarks()); + }else if(remarks.getRemarksType().equals("6")||remarks.getRemarksType().equals("7")){ + reportService.updateBreastfeedRemarks(type + remarks.getRemarks(),remarks.getPersonId()+"",begin,end,remarksType); + }else reportService.updateRemarksById(remarksDTO.getReportId(),type + remarks.getRemarks()); + + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(Long remarksId,Long reportId) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Remarks remarks = remarksService.selectById(remarksId); + Report report = reportService.selectById(reportId); + String oldRemarks = report.getRemarks(); + String remarksType = remarks.getRemarksType(); + Long personId = remarks.getPersonId(); //用户编号 + Person person = commonPersonService.getPersonById(personId ); + Map personExt = (Map)person.getExt(); + + String beginDate = sdf.format(remarks.getBeginDate()); + String endDate = sdf.format(remarks.getEndDate()); + + if(remarksType.equals("5")){ + reportService.updateRemarksByIdAndDate(personId +"",beginDate,endDate,null); + if(remarks.getRemarks().contains("年假")) { + LocalDate begin = LocalDate.parse(beginDate); + LocalDate end = LocalDate.parse(endDate); + double days = begin.until(end, ChronoUnit.DAYS)+1; + double d = Convert.toDouble(personExt.get("annualLeave")); + personExt.put("annualLeave", Convert.toStr(d + days)); + personService.update(person); + } + }else if(remarksType.equals("6") ||remarksType.equals("7")){ + reportService.updateBreastfeedRemarks(null,personId +"",beginDate,endDate,remarksType); + } + else + { + if(oldRemarks!=null && !oldRemarks.equals("")){ + if(oldRemarks.split(";").length < 2) reportService.updateRemarksById(reportId,null); + else + { + String newRemarks=""; + String type= getType(remarksType); + String[] arr = oldRemarks.split(";"); + for(int i = 0; i> results = null; + + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + List deptList = commonDeptService.getDeptByTips(null);//所有部门列表 + if(deptList.size()>0)deptList.remove(0);//去除顶级部门 + + //当前用户是部门领导,则只返回当前部门 + if(shiroUser.getRoleNames().contains(("部门领导"))){ + results = new ArrayList<>(); + Map map = new HashMap<>(); + map.put("id",shiroUser.getDeptId()); + map.put("simplename",shiroUser.getDeptName()); + results.add(map); + } else if(shiroUser.getRoleNames().contains("人事处")){ // 当前用户是人事处,则在所有部门列表中再新增“专务”、“部门领导”、“聘工”选项 + Dept dept = new Dept(); + dept.setId(new Long(-1)); + dept.setSimplename("专务"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-2)); + dept.setSimplename("部门领导"); + deptList.add(dept); + dept = new Dept(); + dept.setId(new Long(-3)); + dept.setSimplename("聘工"); + deptList.add(dept); + } + if(results != null) { + return ResponseData.success(results); + } else { + return ResponseData.success(deptList); + } + } + + + /** + * 查询报表数据列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String deptid, String name,String month,String date,String isMark,String isAbnormal) { + beginDate = endDate = ""; + List> results = null; + Page> page = new PageFactory>().defaultPage(); + + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + + results = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + new ReportWarpper(results).warp(); + page.setRecords(results); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 导出查询到的报表数据列表 + */ + @GetMapping(value = "/batchExport") + @ResponseBody + public void batchExport(String deptid,String name,String month,String date,String isMark,String isAbnormal,HttpServletResponse response) throws IOException { + Page> page = new PageFactory>().defaultPage(); + page.setCurrent(1); + page.setSearchCount(false); + page.setSize(Integer.MAX_VALUE); + String condition=""; + switch (deptid){ + case "-1": condition = "zhuanwu";deptid = "";break; + case "-2": condition = "leader";deptid = "";break; + case "-3":condition = "pingong";deptid = "";break; + } + + if((month!=null && month!="") && (date==null||date=="")) + { + endDate = month+"-20"; + LocalDate end = LocalDate.parse(month+"-20"); + beginDate = df.format(end.minusMonths(1).plusDays(1)); + } + else if(date!=null && date!="") + { + beginDate = endDate = date; + } + List> list = reportService.searchReportList(page,deptid,name,condition,beginDate,endDate,isMark,isAbnormal); + super.exportExcel(AtdExportEnum.REPORT_DATA_EXPORT, list, response); + } + + + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java new file mode 100644 index 0000000..d1460f1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SpecialDayController.java @@ -0,0 +1,142 @@ +package com.casic.missiles.modular.system.controller; + +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ErrorResponseData; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import com.casic.missiles.modular.system.warpper.SpecialDayWarpper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 控制器 + * + * @author fengshuonan + * @Date 2019-03-12 15:46:45 + */ +@Controller +@RequestMapping("/specialDay") +public class SpecialDayController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayController.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private ISpecialDayImportService specialDayImportService; + + /** + * 获取列表 + */ + @RequestMapping(value = "/list") + @ResponseBody + public Object list(String name) { + Page> page = new PageFactory>().defaultPage(); + List> list = specialDayService.list(page,name); + new SpecialDayWarpper(list).warp(); + page.setRecords(list); + return ResponseData.success(super.packForBT(page)); + } + + /** + * 新增 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + public Object add(SpecialDay specialDay) { + SpecialDay specialDay0 = specialDayService.isDateExist(formatter.format(specialDay.getBeginDate()),formatter.format(specialDay.getEndDate())); + if(specialDay0 != null) + return ResponseData.error("已存在相关日期的特殊考勤日条目"); + + specialDayService.insert(specialDay); + return ResponseData.success(); + } + + /** + * 删除 + */ + @RequestMapping(value = "/delete") + @ResponseBody + public Object delete(@RequestParam List ids) { + try { + specialDayService.deleteBatchIds(ids); + }catch (Exception e){ + logger.error("删除失败", e); + e.printStackTrace(); + return ResponseData.error("删除失败"); + } + return ResponseData.success(); + } + + /** + * 修改 + */ + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ResponseBody + public Object update(SpecialDay specialDay) { + specialDayService.updateById(specialDay); + return ResponseData.success(); + } + + /** + * 批量导入特殊考勤日信息 + * + * @param file 特殊考勤日 + * @return + * @throws Exception + */ + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + try { + //解析文件流 + ResponseData responseData = specialDayImportService.parseSourceFile(file); + //校验及保存数据 + return specialDayImportService.specialDayImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("特殊考勤日导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } + + /** + * 详情 + */ + @RequestMapping(value = "/detail/{tiaoXiuId}") + @ResponseBody + public Object detail(@PathVariable("tiaoXiuId") Integer id) { + return specialDayService.selectById(id); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java new file mode 100644 index 0000000..9c32c93 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/SynDataNowController.java @@ -0,0 +1,130 @@ +package com.casic.missiles.modular.system.controller; + + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; + +//import org.apache.tomcat.jni.File; + +/** + * 生成报表控制器 + * + * @author fengshuonan + * @Date 2019-03-07 17:31:31 + */ + +@Controller +@RequestMapping("/synDataNow") +public class SynDataNowController extends BaseController { + +// @Value("${path}") +// private String path; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat tf = new SimpleDateFormat("HH:mm:ss"); + + + @Autowired + private IReportService reportService; + + @Autowired + private IRecRecordService recRecordService; + + + @Autowired + private ISpecialDayService specialDayService; + + @Autowired + private IOtReportService otReportService; + + @Autowired + private ICommonPermissionService permissionService; + + +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + public static Connection conn = null; //创建一个用于连接的对象 + PreparedStatement ps = null; //创建一个发送sql语句的对象 + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + + + /** + * 立即同步数据 + */ +// @GetMapping(value = "/generate") + @ResponseBody + @RequestMapping(value = "/syn", method = RequestMethod.POST) + public Object synAndGenetate(String beginDate, String endDate, HttpServletResponse response) throws IOException, SQLException, ParseException { +// SynAndGenerate synAndGenerate=new SynAndGenerate(); + + String resultNet = "以下设备上的记录由于网络不通同步失败:"; + String resultErr = "CatchError:"; + + String dept =""; + ShiroUser shiroUser = permissionService.getCurrLoginUser(); + if(!shiroUser.getRoleNames().contains("超级管理员")) { + dept = shiroUser.getDeptName(); + } + + //同步数据 +// List> deviceList = recDeviceService.list(); +// for (int i = 0; i < deviceList.size(); i++) { +// String ip= deviceList.get(i).get("ip").toString(); +// String port = deviceList.get(i).get("port").toString(); +// String mark = deviceList.get(i).get("mark").toString(); +// int re = synAndGenerate.syn(beginDate,endDate,ip,port,dept); +// if(re == -2){ +// if(resultNet.length()==21)resultNet = resultNet + mark; +// else resultNet = resultNet+", "+mark; +// }else if(re == -1){ +// resultErr = resultErr + mark+"同步失败; "; +// } +// } + + //生成数据 +// if(!synAndGenerate.generate(beginDate,endDate,dept)){ +// resultErr = resultErr + "生成报表数据失败!"; +// } +// +// if(resultNet.length()>21 || resultErr.length()>11 ){ +// String result =""; +// if(resultNet.length()>21)result = result+resultNet; +// if(resultErr.length()>11)result = result+resultErr; +// return ResponseData.error(result); +// } + + + return ResponseData.success(); + } + + +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java new file mode 100644 index 0000000..9e61144 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.factory.CommonPermissionFactory; +import com.casic.missiles.core.util.ToolUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * 控制器 + * + * @author dev123 + * @Date 2018-11-19 13:15:14 + */ +@RestController +public class TemplateController extends BaseController { + private static Logger logger = LoggerFactory.getLogger(TemplateController.class); + + @Value("${iris.config.static-location}") + private String path; + /** + * 文件模板下载 (待优化) + */ + @GetMapping("/template/download") + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) + throws ServletException, IOException { + //String path = gunsProperties.getConfigPath(); + //logger.info(path); +// if (path.startsWith("/")) { +// path = path.substring(1); +// } + File file = new File(path, filename); + // 获取文件名 + String fileName = null; + if (filename.contains("/")) { + fileName = filename.substring(filename.lastIndexOf("/") + 1); + } else { + fileName = filename; + } + + // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setContentLength((int) file.length()); + + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int readTmp = 0; + while ((readTmp = fis.read(buffer)) != -1) { + response.getOutputStream().write(buffer, 0, readTmp); + } + } catch (Exception e) { + logger.info(e.getMessage()); + e.printStackTrace(); + } finally { + response.getOutputStream().flush(); + response.getOutputStream().close(); + fis.close(); + } + } + + @PostMapping("/app/checkVersion") + public ResponseData checkVersion(String nowVersion) { +// String path = gunsProperties.getDownloadPath(); +// File file = new File(path.concat(DeviceConst.APP_DOWNLOAD)); +// if (file.isDirectory()) { +// String[] filelist = file.list(); +// if (ToolUtil.isNotEmpty(filelist)) { +// Arrays.sort(filelist); +// String apkName = filelist[filelist.length - 1]; +// String version = apkName.replaceAll(".apk", ""); +// VersionDto versionDto = new VersionDto(); +// versionDto.setVersion(version); +// versionDto.setDownloadUrl(DeviceConst.APP_DOWNLOAD.concat(apkName)); +// return ResponseData.success(versionDto); +// } +// } + return ResponseData.error("暂无APK版本"); + } + + @PostMapping("/app/registerGeTui") + public ResponseData geTuiRegister(@RequestParam String clientid) { + + //service.registerGeTui(CommonPermissionFactory.me().getCurrLoginUser().getId(), clientid); + return ResponseData.success(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java new file mode 100644 index 0000000..84d74bc --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/AtdRulesMapper.java @@ -0,0 +1,21 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface AtdRulesMapper extends BaseMapper { + + List> list(); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java new file mode 100644 index 0000000..20c4080 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/OtReportMapper.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface OtReportMapper extends BaseMapper { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java new file mode 100644 index 0000000..1034124 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RecRecordMapper.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ + +public interface RecRecordMapper extends BaseMapper { + + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + List> getMaxDate(); + + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java new file mode 100644 index 0000000..d032031 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/RemarksMapper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface RemarksMapper extends BaseMapper { + + + List> list(); + + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java new file mode 100644 index 0000000..d0c9a8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/ReportMapper.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface ReportMapper extends BaseMapper { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java new file mode 100644 index 0000000..985df91 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/SpecialDayMapper.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Mapper 接口 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface SpecialDayMapper extends BaseMapper { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page") Page page, @Param("name") String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml new file mode 100644 index 0000000..a728ffe --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/AtdRulesMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + ID AS id, WORK_TIME_BEGIN AS workTimeBegin, BREAK_TIME_BEGIN AS breakTimeBegin, BREAK_TIME_END AS breakTimeEnd, WORK_TIME_END AS workTimeEnd, DELAY_BEGIN1 AS delayBegin1, DELAY_BEGIN2 AS delayBegin2, ADVANCE_END AS advanceEnd, WORK_DAY AS workDay + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml new file mode 100644 index 0000000..e814ce5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/OtReportMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME AS name, DATE AS date, REC_TIME AS recTime, OT_MINUTE AS otMinute + + + + + insert into atd_ot_report (DEPT_ID, NAME, DATE, REC_TIME, OT_MINUTE) + values + + (#{report.deptId, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.recTime, jdbcType=VARCHAR}, + #{report.otMinute, jdbcType=VARCHAR}) + + + + + + + + + update atd_ot_report set REC_TIME=#{time}, OT_MINUTE = #{ot_minute} where ID=#{iid} + + + + update ot_report r, staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from ot_report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml new file mode 100644 index 0000000..0f1549a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RecRecordMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, DATETIME AS datetime, DEV_CODE AS devCode,DOOR_CODE AS doorCode,INOUT_TYPE AS inoutType + + + + + + + + + + + + + + + + + + + insert into rec_record (id, rec_date, rec_time) + values + + (#{rec_record.id, jdbcType=VARCHAR}, + #{rec_record.recDate, jdbcType=VARCHAR}, + #{rec_record.recTime, jdbcType=VARCHAR}) + + + + + + delete from rec_record where rec_date between #{beginDate} and #{endDate} + + + + update rec_record set rec_time = #{recTime} where + + id=#{id} + + + and rec_date=#{date} + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml new file mode 100644 index 0000000..fc6afa1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/RemarksMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + ID AS id, PERSON_ID AS personId, BEGIN_DATE AS beginDate, BEGIN_HALF_INFO AS beginHalfInfo, END_DATE AS endDate, END_HALF_INFO AS endHalfInfo, REMARKS AS remarks, REMARKS_TYPE AS remarksType + + + + + + + + + + delete from atd_remarks where + + PERSON_ID=#{staffId} + + + and REMARKS_TYPE=#{remarksType} + + + and #{date} between BEGIN_DATE and END_DATE + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml new file mode 100644 index 0000000..edb2e01 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/ReportMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + ID AS id, DEPT_ID AS deptId, NAME as name, DATE as date, TIME as time, LATE as late, EARLY as early, ABSENT_AM AS absentAm, ABSENT_PM AS absentPm, ABSENT_ONE_DAY AS absentOneDay, REMARKS ASremarks + + + + delete from report where date between #{beginDate} and #{endDate} + + + + + insert into report (dept, name, date, time, late, early,absent_am,absent_pm,absent_one_day,remarks) + values + + (#{report.dept, jdbcType=VARCHAR}, + #{report.name, jdbcType=VARCHAR}, + #{report.date, jdbcType=VARCHAR}, + #{report.time, jdbcType=VARCHAR}, + #{report.late, jdbcType=VARCHAR}, + #{report.early, jdbcType=VARCHAR}, + #{report.absentAm, jdbcType=VARCHAR}, + #{report.absentPm, jdbcType=VARCHAR}, + #{report.absentOneDay, jdbcType=VARCHAR}, + #{report.remarks, jdbcType=VARCHAR}) + + + + + + + update atd_report set REMARKS=(CASE + WHEN REMARKS="" THEN #{remarks} + WHEN REMARKS is null THEN #{remarks} + ELSE CONCAT(REMARKS,";",#{remarks}) END) + where ID=#{id} + + + + UPDATE atd_report a, sys_person b set a.REMARKS=(CASE + WHEN LOCATE('哺乳假', a.REMARKS)>0 THEN (CASE + WHEN #{remarks} is null THEN (CASE + WHEN LOCATE('哺乳假', a.REMARKS) > LOCATE(';', a.REMARKS) THEN substring_index(a.REMARKS, ';', -1) + else substring_index(a.REMARKS, ';', 1) end) + else CONCAT(a.REMARKS,";",#{remarks}) end) + ELSE #{remarks} END) + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + + + + + + + delete from report where + + date between #{beginDate} and #{endDate} + + + + + + + + + update atd_report set TIME=#{time}, + LATE=#{late}, + EARLY=#{early}, + ABSENT_AM=#{absent_am}, + ABSENT_PM=#{absent_pm}, + ABSENT_ONE_DAY=#{absent_one_day}, + REMARKS=#{remarks} + where ID=#{id} + + + + update report r ,staff s + set r.dept = s.dept,r.`name`=s.`name` where + 1=1 + + and s.id=#{staffId} + + + and r.name=#{name} + + + and r.dept=#{dept} + + + + + delete from report where 1=1 + + and name=#{name} + + + and dept=#{dept} + + + + + UPDATE atd_report a, sys_person b set + + a.REMARKS=(CASE + WHEN REMARKS is null THEN #{remarks} + WHEN REMARKS="" THEN #{remarks} + ELSE CONCAT(a.REMARKS,";",#{remarks}) END) + + + a.REMARKS=(CASE + WHEN LOCATE('晚到减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"晚到减免:请假-哺乳假;","") + WHEN LOCATE(';晚到减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";晚到减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"晚到减免:请假-哺乳假","") END) + + + a.REMARKS=(CASE + WHEN LOCATE('早走减免:请假-哺乳假;', a.REMARKS)>0 THEN replace(a.REMARKS,"早走减免:请假-哺乳假;","") + WHEN LOCATE(';早走减免:请假-哺乳假', a.REMARKS)>0 THEN replace(a.REMARKS,";早走减免:请假-哺乳假","") + ELSE replace(a.REMARKS,"早走减免:请假-哺乳假","") END) + + where + a.NAME=b.NAME + and a.DEPT_ID=b.DEPTID + and b.ID=#{personId} + and a.DATE between #{beginDate} and #{endDate} + + and (a.LATE != "—" or a.ABSENT_AM != "—" or a.ABSENT_ONE_DAY != "—") + + + and (a.EARLY != "—" or a.ABSENT_PM != "—" or a.ABSENT_ONE_DAY != "—") + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml new file mode 100644 index 0000000..ec2d750 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dao/mapping/SpecialDayMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + ID AS id,NAME AS name,BEGIN_DATE as beginDate,END_DATE as endDate, IS_KAOQIN AS isKaoqin + + + + + + + + + + + + + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java new file mode 100644 index 0000000..9504050 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/dto/RemarksDTO.java @@ -0,0 +1,141 @@ +package com.casic.missiles.modular.system.dto; + +import com.casic.missiles.modular.system.model.Remarks; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class RemarksDTO { + + private Long personId;//用户id + private Long id;//主键 + private Long reportId;//report表主键 + private String beginDate;//开始日期 + private String beginHalfInfo;//开始时间 + private String endDate;//结束日期 + private String endHalfInfo;//结束时间 + private String remarks;//备注信息 + private String remarksType;//备注类型 + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getReportId() { + return reportId; + } + + public void setReportId(Long reportId) { + this.reportId = reportId; + } + + public String getBeginDate() { + return beginDate; + } + + public void setBeginDate(String beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + public String toString() { + return "RemarksDTO{" + + "id='" + id + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } + + public Remarks toRemarks(){ + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Remarks remarks = new Remarks(); + remarks.setPersonId(this.personId); + remarks.setId(this.id); + if(this.beginDate!=null&&!this.beginDate.equals("")){ + remarks.setBeginDate(sdf.parse(this.beginDate)); + }else{ + remarks.setBeginDate(null); + } + remarks.setBeginHalfInfo(this.beginHalfInfo); + if(this.endDate!=null&&!this.endDate.equals("")){ + Date d = sdf.parse(this.endDate); + remarks.setEndDate(d); + }else{ + remarks.setEndDate(null); + } + remarks.setEndHalfInfo(this.endHalfInfo); + remarks.setRemarksType(this.remarksType); + remarks.setRemarks(this.remarks); + return remarks; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java new file mode 100644 index 0000000..3b6140f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/AtdExportEnum.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.system.enums; + +import com.casic.missiles.config.properties.CasicProperties; +import com.casic.missiles.core.enums.ExportExcelEnum; +import com.casic.missiles.core.util.SpringContextHolder; + +public enum AtdExportEnum implements ExportExcelEnum { + + REPORT_DATA_EXPORT("reportDataTemp.xlsx","reportDataTemp.xlsx","考勤报表数据"), + MAKE_REPORT_EXPORT("makeReportTemp.xlsx","makeReportTemp.xlsx","考勤报表"); + + AtdExportEnum(String fileTempPath, String fileName, String description) { + this.fileTempPath = SpringContextHolder.getBean(CasicProperties.class).getExportTempPath().concat(fileTempPath); + this.fileName = fileName; + this.description = description; + } + + /** + * 导出模板相对路径 + */ + private String fileTempPath; + /** + * 下载文件名 + */ + private String fileName; + /** + * 描述信息 + */ + private String description; + + @Override + public String getFileTempPath() { + return fileTempPath; + } + + @Override + public String getFileName() { + return fileName; + } + + @Override + public String getDescription() { + return description; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java new file mode 100644 index 0000000..d8b642f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksType.java @@ -0,0 +1,70 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksType { + COMELATE("1", "迟到"), + LEAVEEARLY("2", "早退"), + ABSENTAM("3", "上午旷工"), + ABSENTPM("4", "下午旷工"), + ABSENTONE("5", "旷工一天"); + + private String value; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksType type : RemarksType.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksType(String value, String displayName) { + this.value = value; + this.displayName = displayName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksType getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksType getEnumByName(String name) { + for (RemarksType type : RemarksType.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } + public static RemarksType[] list(String name) { + return RemarksType.values(); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java new file mode 100644 index 0000000..90c44e1 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/enums/RemarksTypeSecond.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.enums; + +import java.util.HashMap; +import java.util.Map; + +public enum RemarksTypeSecond { + COMELATE1("1","1","前一天加班太晚"), + COMELATE2("2","1", "因公迟到"), + COMELATE3("3","1", "其他"), + LEAVEEARLY1("4","2", "因公早退"), + LEAVEEARLY2("5","2", "其他原因"), + ABSENTAM1("6","3", "出差"), + ABSENTAM2("7","3", "因公"), + ABSENTAM3("8","3", "请假-年假"), + ABSENTAM4("9","3", "请假-事假"), + ABSENTAM5("10","3", "请假-病假"), + ABSENTAM6("11","3", "请假-探亲假"), + ABSENTAM7("12","3", "请假-婚假"), + ABSENTAM8("13","3", "请假-生育假"), + ABSENTAM9("14","3", "请假-丧假"), + ABSENTAM10("15","3", "请假-工伤"), + ABSENTAM11("16","3", "值班调休"), + ABSENTAM12("17","3", "其他原因"), + ABSENTPM1("6","4", "出差"), + ABSENTPM2("7","4", "因公"), + ABSENTPM3("8","4", "请假-年假"), + ABSENTPM4("9","4", "请假-事假"), + ABSENTPM5("10","4", "请假-病假"), + ABSENTPM6("11","4", "请假-探亲假"), + ABSENTPM7("12","4", "请假-婚假"), + ABSENTPM8("13","4", "请假-生育假"), + ABSENTPM9("14","4", "请假-丧假"), + ABSENTPM10("15","4", "请假-工伤"), + ABSENTPM11("16","4", "值班调休"), + ABSENTPM12("17","4", "其他原因"), + ABSENTONE("3","5", ""); + + private String value; + private String typeValue; + private String displayName; + + static Map enumMap = new HashMap(); + + static { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + enumMap.put(type.getValue(), type); + } + } + + private RemarksTypeSecond(String value,String typeValue, String displayName) { + this.value = value; + this.typeValue = typeValue; + this.displayName = displayName; + + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getTypeValue() { + return typeValue; + } + + public void setTypeValue(String typeValue) { + this.typeValue = typeValue; + } + + /** + * 根据编号返回备注类型 + * @param value + * @return + */ + public static RemarksTypeSecond getEnumByValue(String value) { + return enumMap.get(value); + } + + /** + * 根据名称返回备注类型 + * @param name + * @return + */ + public static RemarksTypeSecond getEnumByName(String name) { + for (RemarksTypeSecond type : RemarksTypeSecond.values()) { + if(type.displayName.equals(name)){ + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java new file mode 100644 index 0000000..7592c6a --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/AtdRules.java @@ -0,0 +1,172 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Time; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Data +@TableName("atd_rules") +public class AtdRules extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Integer id; + /** + * 上班时间 + */ + @TableField("WORK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeBegin; + /** + * 休息开始时间 + */ + @TableField("BREAK_TIME_BEGIN") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeBegin; + /** + * 休息结束时间 + */ + @TableField("BREAK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time breakTimeEnd; + /** + * 下班时间 + */ + @TableField("WORK_TIME_END") +// @DateTimeFormat(pattern = "HH:mm:ss") + private Time workTimeEnd; + /** + * 上班允许晚到时长1(单位分钟,这之前不算迟到) + */ + @TableField("DELAY_BEGIN1") + private Integer delayBegin1; + /** + * 上班允许晚到时长2(单位分钟,这之前不算旷工) + */ + @TableField("DELAY_BEGIN2") + private Integer delayBegin2; + /** + * 下班允许早走时长,单位分钟,提前*分钟走不算早退 + */ + @TableField("ADVANCE_END") + private Integer advanceEnd; + /** + * 工作日,如“4,5,6,7”代表星期4、5、6和星期日是工作日 + */ + @TableField("WORK_DAY") + private String workDay; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getWorkTimeBegin() { + return workTimeBegin; + } + + public void setWorkTimeBegin(Time workTimeBegin) { + this.workTimeBegin = workTimeBegin; + } + + public Date getBreakTimeBegin() { + return breakTimeBegin; + } + + public void setBreakTimeBegin(Time breakTimeBegin) { + this.breakTimeBegin = breakTimeBegin; + } + + public Date getBreakTimeEnd() { + return breakTimeEnd; + } + + public void setBreakTimeEnd(Time breakTimeEnd) { + this.breakTimeEnd = breakTimeEnd; + } + + public Date getWorkTimeEnd() { + return workTimeEnd; + } + + public void setWorkTimeEnd(Time workTimeEnd) { + this.workTimeEnd = workTimeEnd; + } + + public Integer getDelayBegin1() { + return delayBegin1; + } + + public void setDelayBegin1(Integer delayBegin1) { + this.delayBegin1 = delayBegin1; + } + + public Integer getDelayBegin2() { + return delayBegin2; + } + + public void setDelayBegin2(Integer delayBegin2) { + this.delayBegin2 = delayBegin2; + } + + public Integer getAdvanceEnd() { + return advanceEnd; + } + + public void setAdvanceEnd(Integer advanceEnd) { + this.advanceEnd = advanceEnd; + } + + public String getWorkDay() { + return workDay; + } + + public void setWorkDay(String workDay) { + this.workDay = workDay; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "AtdRules{" + + "id=" + id + + ", workTimeBegin=" + workTimeBegin + + ", breakTimeBegin=" + breakTimeBegin + + ", breakTimeEnd=" + breakTimeEnd + + ", workTimeEnd=" + workTimeEnd + + ", delayBegin1=" + delayBegin1 + + ", delayBegin2=" + delayBegin2 + + ", advanceEnd=" + advanceEnd + + ", workDay=" + workDay + + "}"; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java new file mode 100644 index 0000000..63ac9d5 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/OtReport.java @@ -0,0 +1,104 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_ot_report") +public class OtReport extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("REC_TIME") + private String recTime; + @TableField("OT_MINUTE") + private String otMinute; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getRecTime() { + return recTime; + } + + public void setRecTime(String recTime) { + this.recTime = recTime; + } + + public String getOtMinute() { + return otMinute; + } + + public void setOtMinute(String otMinute) { + this.otMinute = otMinute; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "OtReport{" + + "id=" + id + + ", deptId='" + deptId + '\'' + + ", name='" + name + '\'' + + ", date=" + date + + ", recTime='" + recTime + '\'' + + ", otMinute='" + otMinute + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java new file mode 100644 index 0000000..ba5679e --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/RecRecord.java @@ -0,0 +1,158 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 各终端的识别记录表 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("rec_record") +public class RecRecord extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + /** + * 原始记录id + */ + @TableField("ORIGINAL_ID") + private Long originalId; + /** + * 对应person表主键 + */ + @TableField("PERSON_ID") + private Long personId; + /** + * 识别时间 + */ + @TableField("DATETIME") + private Date datetime; + /** + * 设备业务编码 + */ + @TableField("DEV_CODE") + private String devCode; + + /** + * 门编码 + */ + @TableField("DOOR_CODE") + private String doorCode; + + /** + * 进出标记 + */ + @TableField("INOUT_TYPE") + private String inoutType; + + @TableField("TEMPERATURE") + private String temperature; + + @TableField("DEV_IP") + private String devIp; + + @TableField("SYNC_TIME") + private Date syncTime; + + @Override + protected Serializable pkVal() { + return this.id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOriginalId() { + return originalId; + } + + public void setOriginalId(Long originalId) { + this.originalId = originalId; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getDatetime() { + return datetime; + } + + public void setDatetime(Date datetime) { + this.datetime = datetime; + } + + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + public String getDoorCode() { + return doorCode; + } + + public void setDoorCode(String doorCode) { + this.doorCode = doorCode; + } + + public String getInoutType() { + return inoutType; + } + + public void setInoutType(String inoutType) { + this.inoutType = inoutType; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getDevIp() { + return devIp; + } + + public void setDevIp(String devIp) { + this.devIp = devIp; + } + + public Date getSyncTime() { + return syncTime; + } + + public void setSyncTime(Date syncTime) { + this.syncTime = syncTime; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java new file mode 100644 index 0000000..1002ac9 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Remarks.java @@ -0,0 +1,125 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_remarks") +public class Remarks extends Model { + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("PERSON_ID") + private Long personId; + @TableField("BEGIN_DATE") + private Date beginDate; + @TableField("BEGIN_HALF_INFO") + private String beginHalfInfo; + @TableField("END_DATE") + private Date endDate; + @TableField("END_HALF_INFO") + private String endHalfInfo; + @TableField("REMARKS") + private String remarks; + @TableField("REMARKS_TYPE") + private String remarksType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getPersonId() { + return personId; + } + + public void setPersonId(Long personId) { + this.personId = personId; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public String getBeginHalfInfo() { + return beginHalfInfo; + } + + public void setBeginHalfInfo(String beginHalfInfo) { + this.beginHalfInfo = beginHalfInfo; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getEndHalfInfo() { + return endHalfInfo; + } + + public void setEndHalfInfo(String endHalfInfo) { + this.endHalfInfo = endHalfInfo; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + public String getRemarksType() { + return remarksType; + } + + public void setRemarksType(String remarksType) { + this.remarksType = remarksType; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Remarks{" + + "id=" + id + + ", personId='" + personId + '\'' + + ", beginDate=" + beginDate + + ", beginHalfInfo='" + beginHalfInfo + '\'' + + ", endDate=" + endDate + + ", endHalfInfo='" + endHalfInfo + '\'' + + ", remarks='" + remarks + '\'' + + ", remarksType='" + remarksType + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java new file mode 100644 index 0000000..3fe1302 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/Report.java @@ -0,0 +1,162 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Data +@TableName("atd_report") +public class Report extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + @TableField("DEPT_ID") + private Long deptId; + @TableField("NAME") + private String name; + @TableField("DATE") + private Date date; + @TableField("TIME") + private String time; + @TableField("LATE") + private String late; + @TableField("EARLY") + private String early; + + @TableField("ABSENT_AM") + private String absentAm; + @TableField("ABSENT_PM") + private String absentPm; + @TableField("ABSENT_ONE_DAY") + private String absentOneDay; + + @TableId("REMARKS") + private String remarks; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getLate() { + return late; + } + + public void setLate(String late) { + this.late = late; + } + + public String getEarly() { + return early; + } + + public void setEarly(String early) { + this.early = early; + } + + public String getAbsentAm() { + return absentAm; + } + + public void setAbsentAm(String absentAm) { + this.absentAm = absentAm; + } + + public String getAbsentPm() { + return absentPm; + } + + public void setAbsentPm(String absentPm) { + this.absentPm = absentPm; + } + + public String getAbsentOneDay() { + return absentOneDay; + } + + public void setAbsentOneDay(String absentOneDay) { + this.absentOneDay = absentOneDay; + } + + public String getRemarks() { + return remarks; + } + + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "Report{" + + "id=" + id + + ", deptId=" + deptId + + ", name='" + name + '\'' + + ", date=" + date + + ", time='" + time + '\'' + + ", late='" + late + '\'' + + ", early='" + early + '\'' + + ", absentAm='" + absentAm + '\'' + + ", absentPm='" + absentPm + '\'' + + ", absentOneDay='" + absentOneDay + '\'' + + ", remarks='" + remarks + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java new file mode 100644 index 0000000..a82381f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/ReportRules.java @@ -0,0 +1,123 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Time; +import java.time.LocalTime; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public class ReportRules { + /** + * 实际上班时间 + */ + private LocalTime shangban; + /** + * 实际下班时间 + */ + private LocalTime xiaban; + /** + * 休息开始时间 + */ + private LocalTime split1; + /** + * 休息结束时间 + */ + private LocalTime split2; + /** + * 判断为旷工时长(分钟) + */ + private int absent; + /** + * 上午工作时长(小时) + */ + private float amWorkHours; + /** + * 下午工作时长(小时) + */ + private float pmWorkHours; + /** + * 判断是否为加班的时长(分钟) + */ + private int ot; + + + + public LocalTime getShangban() { + return shangban; + } + + public void setShangban(LocalTime shangban) { + this.shangban = shangban; + } + + public LocalTime getXiaban() { + return xiaban; + } + + public void setXiaban(LocalTime xiaban) { + this.xiaban = xiaban; + } + + public LocalTime getSplit1() { + return split1; + } + + public void setSplit1(LocalTime split1) { + this.split1 = split1; + } + + public LocalTime getSplit2() { + return split2; + } + + public void setSplit2(LocalTime split2) { + this.split2 = split2; + } + + public int getAbsent() { + return absent; + } + + public void setAbsent(int absent) { + this.absent = absent; + } + + public float getAmWorkHours() { + return amWorkHours; + } + + public void setAmWorkHours(float amWorkHours) { + this.amWorkHours = amWorkHours; + } + + public float getPmWorkHours() { + return pmWorkHours; + } + + public void setPmWorkHours(float pmWorkHours) { + this.pmWorkHours = pmWorkHours; + } + + public int getOt() { + return ot; + } + + public void setOt(int ot) { + this.ot = ot; + } +} + diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java new file mode 100644 index 0000000..bc5f4be --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/model/SpecialDay.java @@ -0,0 +1,106 @@ +package com.casic.missiles.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.FieldStrategy; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Data +@TableName("atd_special_day") +public class SpecialDay extends Model { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField("NAME") + private String name; + + @TableField(value = "BEGIN_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + @TableField(value = "END_DATE") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + @TableField("IS_KAOQIN") + private String isKaoqin; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBeginDate() { + return beginDate; + } + + public void setBeginDate(Date beginDate) { + this.beginDate = beginDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "SpciealDay{" + + "id=" + id + + ", name='" + name + '\'' + + ", beginDate=" + beginDate + + ", endDate=" + endDate + + ", isKaoqin='" + isKaoqin + '\'' + + '}'; + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java new file mode 100644 index 0000000..8fa7099 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdPersonService.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Person; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface IAtdPersonService{ + + void update(Person person); + + List> getPersonListByDeptId(Long deptId); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java new file mode 100644 index 0000000..233fb98 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IAtdRulesService.java @@ -0,0 +1,19 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +public interface IAtdRulesService extends IService { + List> list(); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java new file mode 100644 index 0000000..b39ffb6 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IGenerateReportService.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.model.ReportRules; +import org.apache.ibatis.annotations.Param; + +import java.text.ParseException; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IGenerateReportService { + + void generate(String beginDate,String endDate,Long deptId) throws ParseException; + + ReportRules getReportRules(AtdRules AtdRules); + String getRecTime(List> recRecordList,String personId,String date); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java new file mode 100644 index 0000000..ab587c2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IOtReportService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.OtReport; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IOtReportService extends IService { + + Integer bulkInsertOTReport(List otReportList); + List> selectByOtYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + Integer updateOtReport(@Param("iid") Integer iid, @Param("time") String time, @Param("ot_minute") String ot_minute); + Integer updateOtReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java new file mode 100644 index 0000000..0842856 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRecRecordService.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.RecRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRecRecordService extends IService { + List> selectRecordByDeptId(@Param("deptId") String deptId, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + + List> selectRecRecord(@Param("id") String id, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectRecordByDept(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> getMaxDate(); + + List> selectRecordByIdAndDate(@Param("id") String id, @Param("date") String date); + + Integer bulkInsertRecord(List recRecordList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectWithStaff(@Param("dept") String dept, @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + Integer updateRecTime(@Param("id") String id, @Param("date") String date, @Param("recTime") String recTime); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java new file mode 100644 index 0000000..2198b8f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IRemarksService.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IRemarksService extends IService { + + List> list(); + + /** + * 获取备注类型列表 + * @return + */ + RemarksType[] typeList(); + + List> selectByPersonIdAndDate(@Param("personId") String personId, @Param("date") String date); + + List> selectByAllInfo(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + + Integer deleteByStaffIdAndType(@Param("staffId") String staffId, @Param("remarksType") String remarksType, @Param("date") String date); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java new file mode 100644 index 0000000..fdea829 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/IReportService.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.Report; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public interface IReportService extends IService { + + Integer bulkInsertReport(List reportList); + + Integer deleteBetweenDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> searchReportList(@Param("page") Page> page, @Param("deptId") String deptId, @Param("name") String name, @Param("condition") String condition, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("isMark") String isMark, @Param("isAbnormal") String isAbnormal); + + Integer updateRemarksById(@Param("id") Long id, @Param("remarks") String remarks); + + Integer updateRemarksByIdAndDate(@Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarks") String remarks); + + Integer updateRemarksNullById(@Param("id") Integer id); + + List> getMaxDate(); + + List> selectAbsentOneDayByIdAndDate(@Param("personId") String personId, @Param("date") String date); + + Integer deleteAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectAllByDate(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + + List> selectByAllBesidesRemarks(@Param("dept") String dept, @Param("name") String name, @Param("date") String date, @Param("time") String time); + + Integer updateReport(@Param("id") Integer id, @Param("time") String time, @Param("late") String late, @Param("early") String early, @Param("absent_am") String absent_am, @Param("absent_pm") String absent_pm, @Param("absent_one_day") String absent_one_day, @Param("remarks") String remarks); + + Integer updateReportByStaffId(@Param("staffId") String staffId, @Param("name") String name, @Param("dept") String dept); + + Integer deleteByNameAndDept(@Param("name") String name, @Param("dept") String dept); + + Integer updateBreastfeedRemarks(@Param("remarks") String remarks, @Param("personId") String personId, @Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("remarksType") String remarksType); + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java new file mode 100644 index 0000000..661d5fa --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayImportService.java @@ -0,0 +1,29 @@ +package com.casic.missiles.modular.system.service; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 特殊考勤日导入service + */ +public interface ISpecialDayImportService { + + /** + * 特殊考勤日数据导入 + * + * @param list 专题库集合 + */ + ResponseData specialDayImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java new file mode 100644 index 0000000..db9d83c --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/ISpecialDayService.java @@ -0,0 +1,26 @@ +package com.casic.missiles.modular.system.service; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.modular.system.model.SpecialDay; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +public interface ISpecialDayService extends IService { + + List> selectYes(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> selectNo(@Param("beginDate") String beginDate, @Param("endDate") String endDate); + List> isKaoQin(@Param("date") String date); + List> list(@Param("page")Page page, @Param("name")String name); + SpecialDay isDateExist(@Param("beginDate") String beginDate, @Param("endDate") String endDate); +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java new file mode 100644 index 0000000..df74a31 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdPersonServiceImpl.java @@ -0,0 +1,64 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.common.constant.PersonConst; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.constant.state.Order; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.service.IAtdPersonService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class AtdPersonServiceImpl implements IAtdPersonService { + private static final Logger logger = LoggerFactory.getLogger(AtdPersonServiceImpl.class); + + @Autowired + private ICommonPersonService commonPersonService; + + @Override + public void update(Person person) { + commonPersonService.updatePerson(person); + } + + @Override + public List> getPersonListByDeptId(Long deptId){ + List> scopePersons=null; + try { + Page page; + page = new Page(0, Integer.MAX_VALUE); + page.setOpenSort(false); + page.setSearchCount(false); + EntityWrapper> query = new EntityWrapper<>(); + if (ToolUtil.isNotEmpty(deptId + "")) { + query.eq(PersonConst.TABLE_DEPTID, deptId); + } + query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); + + scopePersons = commonPersonService.selectDataScopePersonMap(page, null, query); + } catch (Exception e){ + logger.error(e.getMessage()); + e.printStackTrace(); + } + return scopePersons; + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java new file mode 100644 index 0000000..3a77ab2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/AtdRulesServiceImpl.java @@ -0,0 +1,27 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.AtdRulesMapper; +import com.casic.missiles.modular.system.model.AtdRules; +import com.casic.missiles.modular.system.service.IAtdRulesService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-12-09 + */ +@Service +public class AtdRulesServiceImpl extends ServiceImpl implements IAtdRulesService { + + @Override + public List> list(){ + return this.baseMapper.list(); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java new file mode 100644 index 0000000..4991e34 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/GenerateReportServiceImpl.java @@ -0,0 +1,768 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.*; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.sql.Time; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class GenerateReportServiceImpl implements IGenerateReportService { + private static final Logger logger = LoggerFactory.getLogger(GenerateReportServiceImpl.class); + + + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + DecimalFormat df = new DecimalFormat("0.0");//设置保留位数 + + @Autowired + ISpecialDayService specialDayService; + + @Autowired + ICommonDeptService commonDeptService; + + @Autowired + IAtdRulesService atdRulesService; + + @Autowired + IRecRecordService recRecordService; + + @Autowired + IRemarksService remarksService; + + @Autowired + IReportService reportService; + + @Autowired + IOtReportService otReportService; + + @Autowired + IAtdPersonService atdPersonService; + + + @Override + public void generate(String beginDate, String endDate,Long deptId) throws ParseException { + List reportList = new ArrayList<>(); + List otReportList = new ArrayList<>(); + + LocalDate beginDateDate = LocalDate.parse(beginDate, fomatter); + LocalDate endDateDate = LocalDate.parse(endDate, fomatter); + + //起止日期相差的天数 + long days = beginDateDate.until(endDateDate, ChronoUnit.DAYS) + 1; + + // 获取待处理部门列表 + List deptList = getDeptList(deptId); + + //考勤规则 + AtdRules atdRules = atdRulesService.selectList(null).get(0); + if(atdRules == null || ToolUtil.isEmpty(atdRules.getWorkTimeBegin()) || ToolUtil.isEmpty(atdRules.getWorkTimeEnd()) + || ToolUtil.isEmpty(atdRules.getBreakTimeBegin()) || ToolUtil.isEmpty(atdRules.getBreakTimeEnd()) ){ + return; + } + ReportRules reportRules = getReportRules(atdRules); + LocalTime shangban = reportRules.getShangban(); + LocalTime xiaban = reportRules.getXiaban(); + LocalTime split1 = reportRules.getSplit1(); + LocalTime split2 = reportRules.getSplit2(); + int ot = reportRules.getOt(); + int absent = reportRules.getAbsent(); + String amWorkHours = reportRules.getAmWorkHours()+""; + String pmWorkHours = reportRules.getPmWorkHours()+""; + int delay1 = atdRules.getDelayBegin1(); + int delay2 = atdRules.getDelayBegin2() - atdRules.getDelayBegin1(); + + try { + //分部门生成报表数据 + for (Dept dept : deptList) { + List> currentStaffList = new ArrayList<>(); + currentStaffList = atdPersonService.getPersonListByDeptId(dept.getId());// 当前部门的员工名单 + + //得到当前部门所有员工的识别记录 + List> currentRecordByDept = recRecordService.selectRecordByDeptId(dept.getId()+"", beginDate, endDate); + + for (Map mStaff : currentStaffList) { + String currentID = mStaff.get("id").toString(); + String currentName = mStaff.get("name").toString(); + for (int i = 0; i < days; i++) { + Report mReport = new Report(); + OtReport mOtReport = new OtReport(); + + String currentDate = beginDateDate.plusDays(i).toString(); + LocalDate currentDateDate = LocalDate.parse(currentDate, fomatter); + SpecialDay kqM = specialDayService.isDateExist(currentDate,currentDate); + //如果是周末,且没有设置为考勤日,则跳出继续下一天 + String workDay = atdRules.getWorkDay(); + int nowWeekDay = currentDateDate.getDayOfWeek().getValue()+1; + if ( !workDay.contains(nowWeekDay+"") && kqM==null) { + continue; + } + //如果设置为非考勤日,则跳出继续下一天 + if (kqM!=null && kqM.getIsKaoqin()=="0") { + continue; + } + + //获取当前员工当前日期的识别记录 + String timeString = ""; + String[] timeArr0 = timeString.split(","); + LocalTime t1 = null; + LocalTime t2 = null; + timeString = getRecTime(currentRecordByDept,currentID,currentDate); + timeArr0 = timeString.split(","); + + //在选取2次识别记录之前,先将所有识别记录填入表中 + mReport.setTime(timeString); + + //选取最多2次识别记录 + if (timeArr0.length > 2) { + timeString = timeArr0[0] + "," + timeArr0[timeArr0.length - 1]; + } + String[] timeArr = timeString.split(","); + try { + //获取第1次、第2次识别记录 + if (timeString != "") { + if(timeArr[0].length()>=5) { + int h = Convert.toInt(timeArr[0].substring(0, 2)); + int m = Convert.toInt(timeArr[0].substring(3, 5)); + int s = 00; + t1 = LocalTime.of(h, m, s); + if (timeArr.length == 2) { + if(timeArr[1].length()>=5) { + h = Convert.toInt(timeArr[1].substring(0, 2)); + m = Convert.toInt(timeArr[1].substring(3, 5)); + s = 00; + t2 = LocalTime.of(h, m, s); + } + } + } + } + } + catch (Exception EX){ + logger.error(timeString); + } + + mReport.setDeptId(dept.getId()); + mReport.setName(currentName); + mReport.setDate(sdf.parse(currentDate)); + mReport.setLate("—"); + mReport.setEarly("—"); + mReport.setAbsentAm("—"); + mReport.setAbsentPm("—"); + mReport.setAbsentOneDay("—"); + + + mOtReport.setDeptId(dept.getId()); + mOtReport.setName(currentName); + mOtReport.setDate(sdf.parse(currentDate)); + mOtReport.setRecTime(timeString); + mOtReport.setOtMinute("—"); + + //开始进行考勤判断 + if (timeArr.length == 2) { + + //正常出勤 + if ((t1.isBefore(shangban) || t1.equals(shangban)) && (t2.isAfter(xiaban) || t2.equals(xiaban))) { + + //将正常出勤数据写入reportList + reportList.add(mReport); + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + + continue; + } + + //有异常情况 + else { + //t1 <= 08:45 + if (t1.isBefore(shangban) || t1.equals(shangban)) { + //t2<=08:45 + if (t2.isBefore(shangban) || t2.equals(shangban)) { + mReport.setAbsentOneDay("√"); + } + //t2 > 08:45 && t2 < 12:00 + else if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentAm(df.format((float) num2 / 60)); // 上午相对12:00旷工 + } + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>=12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 下午相对17:30旷工 + } else { + mReport.setEarly(num2 + ""); //下午早退 + } + } + } + //t1 > 08:45 && t1 < 12:00 + else if (t1.isAfter(shangban) && t1.isBefore(split1)) { + long num = Duration.between(shangban, t1).toMinutes(); //相对08:45的晚到时长 + //t2 > 08:45 && t2 < 12:00 + if (t2.isAfter(shangban) && t2.isBefore(split1)) { + long num2 = Duration.between(t2, split1).toMinutes(); + + if (num >= delay2 || num2 >= absent) { + mReport.setAbsentAm(df.format((float) (num + num2 + delay1) / 60)); // 上午旷工 + } else { + mReport.setLate(Convert.toStr(num)); // 上午迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + // t2 >= 12:00 && t2<=13:00 + else if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + // 上午旷工 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + } + //上午迟到 + else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + mReport.setAbsentPm(pmWorkHours); // 下午旷工 + } + //t2>13:00 && t2<17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + // 上午 + if (num >= delay2) { + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + }else { + mReport.setLate(Convert.toStr(num)); // 迟到时长 + } + + // 下午 + if (num2 >= absent) { + mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + }else { + mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + } + // t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + // 上午 + if (num >= delay2) + mReport.setAbsentAm(df.format((float) (num + delay1) / 60)); // 旷工时长 + else mReport.setLate(Convert.toStr(num)); // 迟到时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1 >= 12:00 && t1 <= 13:00 + else if ((t1.isAfter(split1) || t1.equals(split1)) && (t1.isBefore(split2) || t1.equals(split2))) { + // t2 >= 12:00 && t2 <= 13:00 + if ((t2.isAfter(split1) || t2.equals(split1)) && (t2.isBefore(split2) || t2.equals(split2))) { + mReport.setAbsentOneDay("√"); + } + //t2>13:00 && t2 <17:30 + else if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num2 = Duration.between(t2, xiaban).toMinutes(); + if (num2 >= absent) mReport.setAbsentPm(df.format((float) num2 / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>13:00 && t1<17:30 + else if (t1.isAfter(split2) && t1.isBefore(xiaban)) { + mReport.setAbsentAm(amWorkHours); // 上午旷工 + + long num = Duration.between(split2, t1).toMinutes(); //相对13:00的晚到时长 + + //t2>13:00 && t2<17:30 + if (t2.isAfter(split2) && t2.isBefore(xiaban)) { + long num2 = Duration.between(t2, xiaban).toMinutes(); + + if (num >= absent || num2 >= absent) + mReport.setAbsentPm(df.format((float) (num2 + num) / 60)); // 旷工时长 + else mReport.setEarly(Convert.toStr(num2)); // 早退时长 + } + //t2>=17:30 + else if (t2.isAfter(xiaban) || t2.equals(xiaban)) { + if (num >= absent) mReport.setAbsentPm(df.format((float) num / 60)); // 旷工时长 + + long mm = Duration.between(xiaban, t2).toMinutes(); + if (mm >= ot) { + mOtReport.setOtMinute(Convert.toStr(mm)); //加班,填写加班信息 + otReportList.add(mOtReport); + } + } + } + //t1>=17:30 + else if (t1.isAfter(xiaban) || t1.equals(xiaban)) { + mReport.setAbsentOneDay("√"); + + //判断是否已有相关备注 + List> remarks = remarksService.selectByPersonIdAndDate(currentID, currentDate); + if (remarks.size() > 0) { + for (Map m : remarks) { + if (m.get("remarks_type").toString().trim().equals("5")) { + mReport.setRemarks(m.get("remarks").toString()); + } + } + } + } + } + } //endif(timeArr.Length == 2) + + + else if (timeArr.length == 1 || timeString.equals(""))//识别记录为空或只有一次识别记录,旷工一天 + { + if (timeString.equals("")) { + mReport.setTime("无记录"); + } + + mReport.setAbsentOneDay("√"); + } + + //判断完考勤记录得到考勤结果后,检查是否已经添加相关备注 + mReport = checkRemarks(mReport,currentID,currentDate); + + //将异常考勤数据写入reportList + reportList.add(mReport); + + } // 结束对一位员工的考勤 + + } // 结束对一个部门的考勤 + + }//处理完所有识别记录 + + } catch (Exception e) { + logger.error("异常 : generate处理数据错误。" + e.getMessage()); +// return false; + } + + int oldI=0; + int newI=0; + try { + int insertCount=0; + int updateCount=0; + int otCount=0; + int otInsert =0; + List newReportList = new ArrayList<>(); + //存入数据库 + if (!reportList.isEmpty()) { + List> oldReportList = reportService.selectAllByDate(beginDate,endDate); + + for(Report newReport : reportList){ + newI++; + boolean exist=false; + for(Map oldReport : oldReportList){ + oldI++; + String deptC = oldReport.get("deptId").toString(); + String nameC = oldReport.get("name").toString(); + //已存在该记录 + if(deptC.equals(newReport.getDeptId()) &&nameC.equals(newReport.getName()) &&oldReport.get("date").toString().equals(sdf.format(newReport.getDate()))){ + String time1=oldReport.get("time").toString(); + String time2=newReport.getTime(); + exist=true; + if(!time1.equals(time2)) { + String cdNew = newReport.getLate(); + String ztNew = newReport.getEarly(); + String kgAmNew = newReport.getAbsentAm(); + String kgPmNew = newReport.getAbsentPm(); + String kgNew = newReport.getAbsentOneDay(); + String cdOld = oldReport.get("late").toString(); + String ztOld = oldReport.get("early").toString(); + String kgAmOld = oldReport.get("absent_am").toString(); + String kgPmOld = oldReport.get("absent_pm").toString(); + String kgOld = oldReport.get("absent_one_day").toString(); + + String remarksOld=""; + String remarksNew=""; + String remarksFinal = ""; + if(oldReport.get("remarks")!=null)remarksOld=oldReport.get("remarks").toString(); + remarksNew=newReport.getRemarks(); + if(cdNew.equals(cdOld)&&ztNew.equals(ztOld)&&kgAmNew.equals(kgAmOld)&&kgPmNew.equals(kgPmOld)&&kgOld.equals(kgNew)){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksOld); + break; + } + //用户没有在旧的考勤结果上加备注或者新的考勤结果自动添加了旷工1天备注) + if (remarksOld.equals("")||(remarksNew!=null&&remarksNew.contains("旷工1天"))){ + reportService.updateReport(Integer.parseInt(oldReport.get("id").toString()), time2, cdNew, ztNew, kgAmNew, kgPmNew, kgNew, remarksNew); + }else{ + String staffId = ""; +// staffId = staffService.selectByDeptAndName(deptC, nameC).get(0).get("id").toString(); + String date = oldReport.get("date").toString(); + + String[] remarksArr = remarksOld.split(";"); + //迟到变不迟到 + if (!cdOld.equals("—")&&cdNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("迟到")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "1", date); + }else if (remarksArr[i].contains("晚到减免")&&kgAmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //早退变不早退 + if (!ztOld.equals("—")&&ztNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("早退")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "2", date); + }else if (remarksArr[i].contains("早走减免")&&kgPmNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //上午旷工变不旷工 + if (!kgAmOld.equals("—")&&kgAmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("上午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + }else if (remarksArr[i].contains("晚到减免")&&cdNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + //下午旷工变不旷工 + if (!kgPmOld.equals("—")&&kgPmNew.equals("—")) { + for (int i = 0; i < remarksArr.length; i++) { + if (remarksArr[i].contains("下午旷工")) { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + }else if (remarksArr[i].contains("早走减免")&&ztNew.equals("—")) { + remarksArr[i]=""; + } + } + } + + if (!kgOld.equals(kgNew)) { + for (int i = 0; i < remarksArr.length; i++) { + if (!remarksArr[i].contains("旷工1天")) { + if(remarksArr[i].contains("上午旷工")){ + if(kgAmNew.equals("—")){ + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "3", date); + } + } + if(remarksArr[i].contains("下午旷工")){ + if (kgPmNew.equals("—")) { + remarksArr[i] = ""; + remarksService.deleteByStaffIdAndType(staffId, "4", date); + } + } + if(remarksArr[i].contains("晚到减免")){ + if(cdNew.equals("—")&&kgAmNew.equals("—")){ + remarksArr[i] = ""; + } + } + if(remarksArr[i].contains("早走减免")){ + if(ztNew.equals("—")&&kgPmNew.equals("—")){ + remarksArr[i] = ""; + } + } + } else { + remarksArr[i]=""; + remarksService.deleteByStaffIdAndType(staffId, "5", date); + } + } + } + + for(int h=0;h> oldOtReportList = otReportService.selectByDate(beginDate,endDate); + + for(OtReport newOtReport : otReportList){ + boolean exist=false; + + for(Map oldOtReport : oldOtReportList){ + String old =oldOtReport.get("date").toString(); + String nes = sdf.format(newOtReport.getDate()); + + if(oldOtReport.get("deptId") == newOtReport.getDeptId() &&oldOtReport.get("name").toString().equals(newOtReport.getName()) && old.equals(nes)){ + + String time1=oldOtReport.get("rec_time").toString(); + String time2=newOtReport.getRecTime(); + if(!time1.equals(time2)) + { + otReportService.updateOtReport(Integer.parseInt(oldOtReport.get("id").toString()),newOtReport.getRecTime(),newOtReport.getOtMinute()); + otCount++; + } + exist=true; + break; + } + } + + if(!exist) { + otReportService.insert(newOtReport); + otInsert++; + } + } +// log.error("加班数据 :update(" + otCount+"),insert("+otInsert+")"); + }else { +// log.error("加班数据 :0"); + } + + } catch (Exception ex) { +// log.error("异常 : generate存数据库错误。reportCount = " +reportList.size() + ", otReportCount = " +otReportList.size() +"。"+ ex.getMessage()); + System.out.println("存入报表数据失败!"); +// return false; + } + +// return true; + } + + + private List getDeptList(long deptId) + { + List deptList = new ArrayList<>(); + deptList = commonDeptService.getDeptByTips("");//获取所有部门列表 + deptList.remove(0);//去除“顶级”部门 + //如果传入的是特定部门id,则只保留该部门 + if(deptId != -1) { + for(Dept dept:deptList){ + if(dept.getId()!=deptId){ + deptList.remove(dept); + } + } + } + return deptList; + } + + @Override + public String getRecTime(List> recRecordList,String personId,String date) + { + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String recTime=""; + for(Map map:recRecordList){ + //找到当前人员在当前日期的识别记录 + String s = String.valueOf(map.get("datetime")).substring(0,10); + if(map.get("personId").toString().endsWith(personId) && s.equals(date)){ + if(recTime.equals(""))recTime = map.get("datetime").toString().substring(11,16); + else recTime = recTime+","+map.get("datetime").toString().substring(11,16); + } + } + if(!recTime.equals(""))recTime = recordsWarpper(recTime); + return recTime; + } + + @Override + public ReportRules getReportRules(AtdRules AtdRules) + { + ReportRules reportRules = new ReportRules(); + try { + + Calendar c = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + + //计算真实上班时间 + Date workBegin = AtdRules.getWorkTimeBegin(); + int addMin = AtdRules.getDelayBegin1(); + c.setTime(workBegin); + LocalTime wb = LocalTime.parse(sdf.format(c.getTime())); + c.add(Calendar.MINUTE, addMin); + reportRules.setShangban(LocalTime.parse(sdf.format(c.getTime())));// 08:45:20 + + //计算真实下班时间 + Date workEnd = AtdRules.getWorkTimeEnd(); + c.setTime(workEnd); +// addMin = AtdRules.getAdvanceEnd(); +// c.add(Calendar.MINUTE, 0 - addMin); + reportRules.setXiaban(LocalTime.parse(sdf.format(c.getTime())));// 17:30:20 + + //休息开始时间 + Date breakTimeBegin = AtdRules.getBreakTimeBegin(); + reportRules.setSplit1(LocalTime.parse(sdf.format(breakTimeBegin)));//12:00:00 + + //休息结束时间 + Date breakTimeEnd = AtdRules.getBreakTimeEnd(); + reportRules.setSplit2(LocalTime.parse(sdf.format(breakTimeEnd)));//13:00:00 + + //判断加班时长 + reportRules.setOt(30); + + //判断旷工时长 + reportRules.setAbsent(AtdRules.getDelayBegin2()); + + //上午工作时长 + reportRules.setAmWorkHours((float) ChronoUnit.MINUTES.between(wb, reportRules.getSplit1()) / 60); + + //下午工作时长 + reportRules.setPmWorkHours((float) ChronoUnit.MINUTES.between(reportRules.getSplit2(), reportRules.getXiaban()) / 60); + }catch (Exception e) + {} + return reportRules; + + } + + + /** + * 处理某员工的识别记录,包括去重、排序 + */ + private String recordsWarpper(String recTime) { + String recTimeWarppered = ""; + String[] arr = recTime.split(","); + //去重 + List list = new ArrayList(); + for (int h = 0; h < arr.length; h++) { + if (!list.contains(arr[h])) { + list.add(arr[h]); + } + } + String[] newArr = list.toArray(new String[1]); + //排序 + Arrays.sort(newArr); + + recTimeWarppered = String.join(",", newArr); + + return recTimeWarppered; + } + + /** + * 检查是否已有相关备注 + */ + private Report checkRemarks(Report mReport, String id,String date){ + //查询提前添加的备注 + List> remarks = remarksService.selectByPersonIdAndDate(id, date); + + //根据识别记录得到的考勤结果 + String[] remarksType=new String[]{"0","0","0","0","0"}; + int i = 0; + if(!mReport.getLate().equals("—")) {remarksType[i] = "1";i++;} + if(!mReport.getEarly().equals("—")){remarksType[i] = "2";i++;} + if(!mReport.getAbsentAm().equals("—")){remarksType[i] = "3";i++;} + if(!mReport.getAbsentPm().equals("—")){remarksType[i] = "4";i++;} + if(!mReport.getAbsentOneDay().equals("—")){remarksType[i] = "5";i++;} + + for(int j =0;j<5;j++) { + String typeByRecord = remarksType[j]; + if(typeByRecord.equals("0"))break; + //判断是否已有相关备注 + if (remarks.size() > 0) { + boolean isEmpty = true; + for (Map m : remarks) { + String exsitType = m.get("remarks_type").toString().trim(); //已添加的备注类型 + String remarksInfo = m.get("remarks").toString(); //已添加的备注信息 + if (typeByRecord.equals("5")) { + if (exsitType.equals("5")) { + if(isEmpty) { + mReport.setRemarks("旷工1天:" + remarksInfo); + }else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";旷工1天:" + remarksInfo); + } + isEmpty = false; + } + if (exsitType.equals("6")) { + if(isEmpty){ + mReport.setRemarks("晚到减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";晚到减免:" + remarksInfo); + } + isEmpty = false; + } else if (exsitType.equals("7")) { + if(isEmpty){ + mReport.setRemarks("早走减免:" + remarksInfo); + } + else { + String st = mReport.getRemarks(); + mReport.setRemarks(st + ";早走减免:" + remarksInfo); + } + isEmpty = false; + } + } else if (typeByRecord.equals("4") || typeByRecord.equals("2")) { // 下午旷工、早退 + if (exsitType.equals("7")) { + mReport.setRemarks("早走减免:" + remarksInfo); + } + } else if (typeByRecord.equals("3") || typeByRecord.equals("1")) { // 上午旷工、迟到 + if (exsitType.equals("6")) { + mReport.setRemarks("晚到减免:" + remarksInfo); + } + } + } + } + } + return mReport; + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java new file mode 100644 index 0000000..b2e5d6d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/OtReportServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.OtReportMapper; +import com.casic.missiles.modular.system.model.OtReport; +import com.casic.missiles.modular.system.service.IOtReportService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class OtReportServiceImpl extends ServiceImpl implements IOtReportService { + + @Override + public Integer bulkInsertOTReport(List otReportList) { + return this.baseMapper.bulkInsertOTReport(otReportList); + } + + @Override + public List> selectByOtYes(String beginDate,String endDate) + {return this.baseMapper.selectByOtYes(beginDate,endDate);} + + @Override + public List> selectByDate(String beginDate,String endDate){ + return this.baseMapper.selectByDate(beginDate,endDate); + } + + @Override + public Integer updateOtReport(Integer iid,String time,String ot_minute){ + return this.baseMapper.updateOtReport(iid,time,ot_minute); + } + + @Override + public Integer updateOtReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateOtReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java new file mode 100644 index 0000000..ce4fed2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RecRecordServiceImpl.java @@ -0,0 +1,81 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RecRecordMapper; +import com.casic.missiles.modular.system.model.RecRecord; +import com.casic.missiles.modular.system.service.IRecRecordService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 各终端的识别记录表 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RecRecordServiceImpl extends ServiceImpl implements IRecRecordService { + + @Override + public List> selectRecordByDeptId(String deptId,String beginDate,String endDate){ + return this.baseMapper.selectRecordByDeptId(deptId,beginDate,endDate); + } + + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") + public List> selectRecRecord(String id,String beginDate, String endDate) + { + List> result = this.baseMapper.selectRecRecord(id,beginDate,endDate); + return result; + } + + @Override + public List> selectRecordByDept(String dept, String beginDate,String endDate) + { + return this.baseMapper.selectRecordByDept(dept,beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT", key = "#id+'_'+#caches[1]") //id_date + public List> selectRecordByIdAndDate(String id,String date) + { + return this.baseMapper.selectRecordByIdAndDate(id,date); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public Integer bulkInsertRecord(List recRecordList) + { + return this.baseMapper.bulkInsertRecord(recRecordList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) + { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + //@Cacheable(value = "CONSTANT") //id_date, key = "#caches[0]"+"_"+"#caches[3]" + public List> selectWithStaff(String dept,String beginDate, String endDate) + { + return this.baseMapper.selectWithStaff(dept,beginDate,endDate); + } + + @Override + public Integer updateRecTime(String id,String date,String recTime) + { + return this.baseMapper.updateRecTime(id,date,recTime); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java new file mode 100644 index 0000000..aa66ff2 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/RemarksServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.RemarksMapper; +import com.casic.missiles.modular.system.enums.RemarksType; +import com.casic.missiles.modular.system.model.Remarks; +import com.casic.missiles.modular.system.service.IRemarksService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class RemarksServiceImpl extends ServiceImpl implements IRemarksService { + + @Override + public List> list() { + return this.baseMapper.list(); + } + + @Override + public RemarksType[] typeList() { + return RemarksType.values(); + } + + @Override + public List> selectByPersonIdAndDate(String personId,String date) + { + List> result = this.baseMapper.selectByPersonIdAndDate(personId,date); + return result; + } + + + @Override + public List> selectByAllInfo(String personId, String beginDate, String endDate, String remarksType) + {return this.baseMapper.selectByAllInfo(personId,beginDate,endDate,remarksType);} + + @Override + public Integer deleteByStaffIdAndType(String staffId,String remarksType, String date){ + return this.baseMapper.deleteByStaffIdAndType(staffId,remarksType,date); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..236dbdd --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/ReportServiceImpl.java @@ -0,0 +1,112 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.ReportMapper; +import com.casic.missiles.modular.system.model.Report; +import com.casic.missiles.modular.system.service.IReportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +@Service +public class ReportServiceImpl extends ServiceImpl implements IReportService { + @Autowired + ISpecialDayService specialDayService; + + @Override + public Integer bulkInsertReport(List< Report> reportList) { + return this.baseMapper.bulkInsertReport(reportList); + } + + @Override + public Integer deleteBetweenDate(String beginDate,String endDate) { + return this.baseMapper.deleteBetweenDate(beginDate,endDate); + } + + @Override + public List> searchReportList(Page> page, String deptId, String name, String condition, String beginDate,String endDate,String isMark,String isAbnormal) + { + List> result = this.baseMapper.searchReportList(page,deptId,name,condition,beginDate,endDate,isMark,isAbnormal); + + return result; + } + + + @Override + public Integer updateRemarksById(Long id,String remarks) + { + return this.baseMapper.updateRemarksById(id,remarks); + } + + @Override + public Integer updateRemarksByIdAndDate(String personId,String beginDate,String endDate,String remarks) + { + return this.baseMapper.updateRemarksByIdAndDate(personId,beginDate,endDate,remarks); + } + + @Override + public Integer updateRemarksNullById(Integer id) + { + return this.baseMapper.updateRemarksNullById(id); + } + + @Override + public List> getMaxDate() + { + return this.baseMapper.getMaxDate(); + } + + @Override + public List> selectAbsentOneDayByIdAndDate(String personId, String date){ + return this.baseMapper.selectAbsentOneDayByIdAndDate(personId,date); + } + + @Override + public Integer deleteAllByDate( String beginDate, String endDate){ + return this.baseMapper.deleteAllByDate(beginDate,endDate); + } + + @Override + public List> selectAllByDate(String beginDate, String endDate){ + return this.baseMapper.selectAllByDate(beginDate,endDate); + } + + @Override + public List> selectByAllBesidesRemarks(String dept,String name,String date,String time){ + return this.baseMapper.selectByAllBesidesRemarks(dept,name,date,time); + } + + @Override + public Integer updateReport(Integer id,String time, String late,String early,String absent_am,String absent_pm,String absent_one_day,String remarks){ + return this.baseMapper.updateReport(id,time,late,early,absent_am,absent_pm,absent_one_day,remarks); + } + + @Override + public Integer updateReportByStaffId(String staffId,String name,String dept){ + return this.baseMapper.updateReportByStaffId(staffId,name,dept); + } + + @Override + public Integer deleteByNameAndDept(String name,String dept){ + return this.baseMapper.deleteByNameAndDept(name,dept); + } + + @Override + public Integer updateBreastfeedRemarks(String remarks, String personId, String beginDate, String endDate, String remarksType){ + return this.baseMapper.updateBreastfeedRemarks(remarks,personId,beginDate,endDate,remarksType); + } + + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java new file mode 100644 index 0000000..f1cb796 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayImportServiceImpl.java @@ -0,0 +1,127 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayImportService; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.hswebframework.expands.office.excel.ExcelIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.DataInputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员专题库导入service + * + * @author lwh + */ +@Service +public class SpecialDayImportServiceImpl implements ISpecialDayImportService { + private static final Logger logger = LoggerFactory.getLogger(SpecialDayImportServiceImpl.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + protected static final Map mapper = new HashMap<>(); + @Autowired + private ICommonPersonService service; + @Autowired + private ISpecialDayService specialDayService; + + static { + mapper.put("名称", "name"); + mapper.put("开始日期", "beginDate"); + mapper.put("结束日期", "endDate"); + mapper.put("是否考勤", "isKaoqin"); + } + + + /** + * 特殊考勤日导入 + * + * @param list 特殊考勤日集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData specialDayImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + //处理人员信息 + int index = 2; + for (SpecialDay specialDay : list) { + if (ToolUtil.isEmpty(specialDay.getName())) { + results.add("第" + index + "行,名称不能为空"); + break; + } else if (ToolUtil.isEmpty(specialDay.getBeginDate())) { + results.add("第" + index + "行,开始日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getEndDate())){ + results.add("第" + index + "行,结束日期不能为空"); + break; + } else if(ToolUtil.isEmpty(specialDay.getIsKaoqin())){ + results.add("第" + index + "行,是否考勤不能为空"); + break; + }else if(specialDay.getEndDate().before(specialDay.getBeginDate())){ + results.add("第" + index + "行,开始日期不能大于结束日期"); + break; + }else { + if(specialDay.getIsKaoqin().equals("是")) specialDay.setIsKaoqin("1"); + else specialDay.setIsKaoqin("0"); + //校验特殊考勤日信息是否已存在 + String beginDate = formatter.format(specialDay.getBeginDate()); + String endDate = formatter.format(specialDay.getEndDate()); + + SpecialDay specialDay1 = specialDayService.isDateExist(beginDate,endDate); + if (specialDay1 != null) { + results.add("已存在第" + index + "行日期相关的特殊考勤日信息"); + break; + } else { + specialDayService.insert(specialDay); + } + + } + index++; + } + + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List specialDays = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapper, SpecialDay.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + SpecialDay specialDay = row.getResult(); + specialDays.add(specialDay); + } + } else { + //其他sheet停止读取 + logger.info("特殊考勤日导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(specialDays); + } +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java new file mode 100644 index 0000000..a55d523 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/service/impl/SpecialDayServiceImpl.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.system.service.impl; + +import com.baomidou.mybatisplus.plugins.Page; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.dao.SpecialDayMapper; +import com.casic.missiles.modular.system.model.SpecialDay; +import com.casic.missiles.modular.system.service.ISpecialDayService; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; + +import javax.swing.plaf.PanelUI; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author stylefeng123 + * @since 2019-03-12 + */ +@Service +public class SpecialDayServiceImpl extends ServiceImpl implements ISpecialDayService { + + @Override + public List> list(Page page, String name){ + return this.baseMapper.list(page,name); + } + + @Override + public List> selectYes(String beginDate, String endDate) { + List> result = this.baseMapper.selectYes(beginDate,endDate); + return result; + } + + @Override + public List> selectNo(String beginDate,String endDate) { + List> result = this.baseMapper.selectNo(beginDate,endDate); + return result; + } + @Override + public List> isKaoQin( String date) + { + return this.baseMapper.isKaoQin(date); + } + + @Override + public SpecialDay isDateExist(String beginDate, String endDate){ + return this.baseMapper.isDateExist(beginDate,endDate); + } +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java new file mode 100644 index 0000000..b13327d --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/task/GenerateReportTask.java @@ -0,0 +1,132 @@ +package com.casic.missiles.modular.system.task; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.modular.system.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.Date; + +@Component +public class GenerateReportTask { +// @Autowired +// private IGenerateReportService generateReportService; + + private IGenerateReportService generateReportService = SpringContextHolder.getBean(IGenerateReportService.class); + private IRecRecordService recRecordService = SpringContextHolder.getBean(IRecRecordService.class); + private IReportService reportService = SpringContextHolder.getBean(IReportService.class); + private IOtReportService otReportService = SpringContextHolder.getBean(IOtReportService.class); + private IRemarksService remarksService = SpringContextHolder.getBean(IRemarksService.class); + private ISpecialDayService tiaoXiuService = SpringContextHolder.getBean(ISpecialDayService.class); + private IAtdRulesService AtdRulesService = SpringContextHolder.getBean(IAtdRulesService.class); + private ICommonDeptService commonDeptService = SpringContextHolder.getBean(ICommonDeptService.class); + +// @Value("${startDate}") + private String startDate; +// @Value("${time1}") + private String time1; +// @Value("${time2}") + private String time2; +// @Value("${time3}") + private String time3; +// @Value("${time4}") + private String time4; + + static String beginDate=""; + static String endDate=""; + static LocalDate beginDateDate = null; + static LocalDate endDateDate =null; + DateTimeFormatter fomatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + + private Logger log = LoggerFactory.getLogger(this.getClass()); //写日志 + + /** + * 生成报表数据定时任务 + */ + @Scheduled(cron = "${casic.iris.generate.cron}") + public void generateTask() throws ParseException { + try { + Calendar c = Calendar.getInstance(); + String nowS = sdf.format(new Date()); + + //计算生成报表的起始日期(生成报表时含本日期) +// Date d = sdf.parse(nowS); +// List> maxDate = this.reportService.getMaxDate(); +// if (!maxDate.isEmpty() && maxDate.get(0) != null) { +// d = sdf.parse(maxDate.get(0).get("date").toString()); +// } +// c.setTime(d); +// c.add(Calendar.DAY_OF_MONTH, 1);// +1天 +// beginDate = sdf.format(c.getTime()); +// beginDateDate = LocalDate.parse(beginDate, fomatter); +// +// //计算生成报表的截止日期(生成报表时含本日期) +// Date date4 = sdf.parse(nowS); +// c.setTime(date4); +// c.add(Calendar.DAY_OF_MONTH, -1);// -1天 +// endDate = sdf.format(c.getTime()); +// endDateDate = LocalDate.parse(endDate, fomatter); + + beginDate = "2020-05-19"; + beginDateDate = LocalDate.parse(beginDate, fomatter); + endDate ="2020-05-21"; + endDateDate = LocalDate.parse(endDate, fomatter); + //生成报表数据 + if (!endDateDate.isBefore(beginDateDate)) { + Long deptId = new Long((long)-1); + generateReportService.generate(beginDate, endDate, deptId); + } else { + log.error("报表数据已更新到 : " + endDate + " ,无需再生成。"); + } + } + catch (Exception e){ + log.error("generateTimer错误:" +e.getMessage()); + } + } + + + /** + * 连接虹膜设备上的数据库 + * + * @return 连接结果 + */ + // private boolean OpenDB(String ipPort, String dbName, String userName, String userPwd) { +// try { +// +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载驱动 +// +// String dbURL = "jdbc:sqlserver://" + ipPort + ";DatabaseName=" + dbName; //连接服务器和数据库 +// +// +// //得到连接 +// conn = DriverManager.getConnection(dbURL, userName, userPwd); +// +// if (conn != null) { +// System.out.println("Connection Successful!"); //如果连接成功 控制台输出 +// } else { +// System.out.println("Connection fail!"); +// } +// +// } catch (Exception e) { +// // TODO: handle exception +// log.error("异常 :" + ipPort.split(":")[0] + " 连接失败!!!" + e.getMessage()); +// return false; +// } +// +// return true; + // } + + + +} \ No newline at end of file diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java new file mode 100644 index 0000000..fcda951 --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/AtdRulesWarpper.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class AtdRulesWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + public AtdRulesWarpper(Object list) { + super(list); + } + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + @Override + public void warpTheMap(Map map) { + + //去掉年月日信息,只保留时分秒 + if (!ToolUtil.isEmpty(map.get("workTimeBegin"))) { + String s = df.format(map.get("workTimeBegin")); + map.put("workTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("workTimeEnd"))) { + String s = df.format(map.get("workTimeEnd")); + map.put("workTimeEnd", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeBegin"))) { + String s = df.format(map.get("breakTimeBegin")); + map.put("breakTimeBegin", s); + } + if (!ToolUtil.isEmpty(map.get("breakTimeEnd"))) { + String s = df.format(map.get("breakTimeEnd")); + map.put("breakTimeEnd", s); + } + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java new file mode 100644 index 0000000..cfa238f --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/ReportWarpper.java @@ -0,0 +1,94 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.common.service.ICommonPersonService; +import com.casic.missiles.core.shiro.ShiroUser; +import com.casic.missiles.core.util.Convert; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Person; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.Serializable; +import java.util.Map; + +/** + * 报表数据列表的包装类 + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class ReportWarpper extends BaseControllerWarpper { + +// @Resource +// private IStaffService staffService; + + ICommonPermissionService commonPermissionService = SpringContextHolder.getBean(ICommonPermissionService.class); + ICommonPersonService commonPersonService = SpringContextHolder.getBean(ICommonPersonService.class); + + public ReportWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + +// if (!ToolUtil.isEmpty(map.get("remarks"))) { +// String s = map.get("remarks").toString(); +// String[] arr = s.split(";"); +// s = arr[0].substring(arr[0].indexOf(":") + 1); +// if (arr.length > 1) { +// for (int i = 1; i < arr.length; i++) { +// s = s + ";" + arr[i].substring(arr[i].indexOf(":") + 1); +// } +// } +// map.put("remarks", s); +// } + + ShiroUser shiroUser = commonPermissionService .getCurrLoginUser(); + Person person = commonPersonService.getPersonById((Serializable) map.get("personId")); + Map personExt = (Map)person.getExt(); + if (shiroUser.getRoleNames().contains("人事处")) { + String isZhuanwu = Convert.toStr(personExt.get("isZhuanwu")); + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (map.get("deptName").toString().equals("人力资源处") || (isZhuanwu != null && isZhuanwu.equals("1")) || (isLeader != null && isLeader.equals("1"))) { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } else map.put("canEdit", "0"); + } else if (shiroUser.getRoleNames().contains("部门领导")) { + String isLeader = Convert.toStr(personExt.get("isLeader")); + if (isLeader != null && isLeader.equals("1")) { + map.put("canEdit", "0"); + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + } else { + map.put("canEdit", "1"); + if(map.get("late").toString().equals("—") && map.get("early").toString().equals("—")&&map.get("absentAm").toString().equals("—")&&map.get("absentPm").toString().equals("—")&&map.get("absentOneDay").toString().equals("—")) + { + map.put("canEdit", "0"); + } + else { + map.put("canEdit", "1"); + } + } + + + + } + +} diff --git a/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java new file mode 100644 index 0000000..be6157b --- /dev/null +++ b/casic-iris-atd/src/main/java/com/casic/missiles/modular/system/warpper/SpecialDayWarpper.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.system.warpper; + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.util.ToolUtil; + +import java.util.Map; + +/** + * + * @author fengshuonan + * @date 2017年2月19日10:59:02 + */ +public class SpecialDayWarpper extends BaseControllerWarpper { + + public SpecialDayWarpper(Object list) { + super(list); + } + + @Override + public void warpTheMap(Map map) { + if(!ToolUtil.isEmpty(map.get("isKaoqin"))) { + if(map.get("isKaoqin").equals("1")) map.put("isKaoqinName", "是"); + else map.put("isKaoqinName", "否"); + }else{ + map.put("isKaoqinName", ""); + } + + } + +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java index fbb3d51..0940c31 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/controller/IrisPersonController.java @@ -1,9 +1,11 @@ package com.casic.missiles.modular.register.controller; +import com.baomidou.mybatisplus.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.base.controller.ExportController; +import com.casic.missiles.core.base.response.ErrorResponseData; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.annotion.BussinessLog; import com.casic.missiles.core.common.constant.Const; @@ -17,23 +19,30 @@ import com.casic.missiles.core.log.LogObjectHolder; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.enums.IrisExportEnum; import com.casic.missiles.modular.register.model.IrisPersonPhoto; import com.casic.missiles.modular.register.service.IIrisDataService; import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; +import com.casic.missiles.modular.register.service.impl.IrisPersonServiceImpl; import com.casic.missiles.modular.register.util.Base64Util; +import com.casic.missiles.modular.register.warpper.IrisPersonWarpper; import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.dto.PersonResDto; import com.casic.missiles.modular.system.model.Person; import com.casic.missiles.service.ICasicFileService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.SocketTimeoutException; import java.util.List; import java.util.Map; @@ -46,6 +55,7 @@ @RestController @RequestMapping("/person") public class IrisPersonController extends ExportController { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonController.class); @Autowired private ICommonPermissionService permissionService; @@ -174,6 +184,7 @@ Page> defaultPage = new PageFactory>().defaultPage(); DataScope scope = permissionService.getCurrUserDataScope(); Page> page = getPersonPage(defaultPage, keywords, sex, duty, deptid, personType, startTime, endTime, scope); + return ResponseData.success(super.packForBT(page)); } @@ -203,6 +214,7 @@ } query.andNew().eq(PersonConst.TABLE_DELFLAG, 0); List> scopePersons = irisPersonService.selectDataScopePersonMap(defaultPage, scope, query); + new IrisPersonWarpper(scopePersons).warp(); defaultPage.setRecords(scopePersons); query.orderBy(PersonConst.TABLE_PERSONCODE); //展示数据封装 @@ -219,4 +231,30 @@ return ResponseData.success(); } } + + @RequestMapping(value = "/batchImport", method = RequestMethod.POST) + @ResponseBody + public Object batchImport(@RequestParam("file") MultipartFile file) { + + try { + //解析文件流 + ResponseData responseData = irisPersonService.parseSourceFile(file); + //校验及保存数据 + return irisPersonService.personImport((List) responseData.getData()); + + } catch (Exception e) { + + logger.error("人员信息导入失败", e); + if (e instanceof MybatisPlusException) { + String message = e.getCause().getCause().getCause().getMessage(); + return new ErrorResponseData(message); + } + + if(e instanceof SocketTimeoutException) { + return new ErrorResponseData("网络连接超时"); + } + + return ResponseData.error("导入失败"); + } + } } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java new file mode 100644 index 0000000..c2b0114 --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/dto/PersonAtdDTO.java @@ -0,0 +1,165 @@ +package com.casic.missiles.modular.register.dto; + +import com.casic.missiles.core.common.service.ICommonDeptService; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Person; +import org.apache.shiro.crypto.hash.Hash; +import org.apache.xmlbeans.impl.xb.xsdschema.Public; +import org.springframework.beans.factory.annotation.Autowired; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * + *

+ * + * @author stylefeng123 + * @since 2019-03-14 + */ +public class PersonAtdDTO { + + private Long id;//主键 + private String name;//开始日期 + private String deptName;//开始时间 + private String idCardNo;//结束日期 + private String isKaoqin;//结束时间 + private String isOt; + private String isZhuanwu;//备注信息 + private String isLeader;//备注类型 + private String initAnnualLeave; + private String annualLeave; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getIdCardNo() { + return idCardNo; + } + + public void setIdCardNo(String idCardNo) { + this.idCardNo = idCardNo; + } + + public String getIsKaoqin() { + return isKaoqin; + } + + public void setIsKaoqin(String isKaoqin) { + this.isKaoqin = isKaoqin; + } + + public String getIsZhuanwu() { + return isZhuanwu; + } + + public void setIsZhuanwu(String isZhuanwu) { + this.isZhuanwu = isZhuanwu; + } + + public String getIsLeader() { + return isLeader; + } + + public void setIsLeader(String isLeader) { + this.isLeader = isLeader; + } + + public String getInitAnnualLeave() { + return initAnnualLeave; + } + + public void setInitAnnualLeave(String initAnnualLeave) { + this.initAnnualLeave = initAnnualLeave; + } + + public String getAnnualLeave() { + return annualLeave; + } + + public void setAnnualLeave(String annualLeave) { + this.annualLeave = annualLeave; + } + + public String getIsOt() { + return isOt; + } + + public void setIsOt(String isOt) { + this.isOt = isOt; + } + + @Override + public String toString() { + return "PerosnDTO{" + + "id=" + id + + ", name='" + name + '\'' + + ", deptName='" + deptName + '\'' + + ", idCardNo='" + idCardNo + '\'' + + ", isKaoqin='" + isKaoqin + '\'' + + ", isZhuanwu='" + isZhuanwu + '\'' + + ", isLeader='" + isLeader + '\'' + + ", initAnnualLeave='" + initAnnualLeave + '\'' + + ", annualLeave='" + annualLeave + '\'' + + '}'; + } + + public Person toPerson(){ + Person person = new Person(); + try { + person.setName(this.name); + person.setIdCardNo(this.idCardNo); + person.setDelflag("0"); + + Map mapExt = new HashMap<>(); + mapExt.put("initAnnualLeave",this.initAnnualLeave); + mapExt.put("annualLeave",this.annualLeave); + if(this.isKaoqin!=null && !this.isKaoqin.equals("") && this.isKaoqin.equals("否")) + {mapExt.put("isKaoqin","0");}else mapExt.put("isKaoqin","1"); + + if(this.isOt!=null && !this.isOt.equals("") && this.isOt.equals("是")) + {mapExt.put("isOt","1");}else mapExt.put("isOt","0"); + + if(this.isZhuanwu!=null && !this.isZhuanwu.equals("") && this.isZhuanwu.equals("是")) + {mapExt.put("isZhuanwu","1");}else mapExt.put("isZhuanwu","0"); + + if(this.isLeader!=null && !this.isLeader.equals("") && this.isLeader.equals("是")) + {mapExt.put("isLeader","1");}else mapExt.put("isLeader","0"); + + person.setExt(mapExt); + + }catch (Exception e){ + e.printStackTrace(); + return null; + } + + return person; + } +} diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java index 68b16a8..1c9226b 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/IIrisPersonService.java @@ -3,10 +3,14 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; import com.casic.missiles.modular.register.model.IrisData; +import com.casic.missiles.modular.system.dto.PersonDto; import com.casic.missiles.modular.system.model.Person; import org.apache.ibatis.annotations.Param; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -29,4 +33,17 @@ void insert(Person person); void update(Person person); + + /** + * 特殊考勤日数据导入 + * @param list 专题库集合 + */ + ResponseData personImport(List list, Object... args) throws Exception; + + /** + * 解析输入文件流 + * @param file 导入文件 + * @return 特殊考勤日集合 + */ + ResponseData parseSourceFile(MultipartFile file) throws Exception; } diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java index d936cc2..1a411ca 100644 --- a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/service/impl/IrisPersonServiceImpl.java @@ -2,33 +2,61 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.common.constant.Const; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.common.service.ICommonDeptService; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.common.service.ICommonPersonService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.exception.GunsException; import com.casic.missiles.core.meta.annotations.MetaDataBean; +import com.casic.missiles.core.util.Convert; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.metadata.service.IMetadataSupportService; import com.casic.missiles.modular.register.constant.IrisPersonConst; import com.casic.missiles.modular.register.dao.IrisDataMapper; +import com.casic.missiles.modular.register.dto.PersonAtdDTO; +import com.casic.missiles.modular.register.enums.PersonTypeEnums; import com.casic.missiles.modular.register.service.IIrisDataService; +import com.casic.missiles.modular.register.service.IIrisPersonPhotoService; import com.casic.missiles.modular.register.service.IIrisPersonService; import com.casic.missiles.modular.system.dto.PersonDto; +import com.casic.missiles.modular.system.model.Dept; import com.casic.missiles.modular.system.model.Person; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import org.hswebframework.expands.office.excel.ExcelIO; +import java.io.InputStream; import java.io.Serializable; +import java.sql.Date; import java.sql.Timestamp; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Service public class IrisPersonServiceImpl implements IIrisPersonService { + private static final Logger logger = LoggerFactory.getLogger(IrisPersonServiceImpl.class); + protected static final Map mapperExcel = new HashMap<>(); + static { + mapperExcel.put("姓名", "name"); + mapperExcel.put("部门", "deptName"); + mapperExcel.put("身份证号", "idCardNo"); + mapperExcel.put("是否考勤(默认是)", "isKaoqin"); + mapperExcel.put("是否统计加班(默认否)", "isOt"); + mapperExcel.put("是否专务(默认否)", "isZhuanwu"); + mapperExcel.put("是否正职领导(默认否)", "isLeader"); + mapperExcel.put("年假(天)", "initAnnualLeave"); + mapperExcel.put("剩余年假(天)","annualLeave"); + } + @Value("${casic.base.personPrefix:}") private String personPrefix; @Autowired @@ -41,6 +69,11 @@ private IMetadataSupportService supportService; @Autowired private IIrisDataService irisDataService; + @Autowired + private IIrisPersonService irisPersonService; + @Autowired + private ICommonDeptService commonDeptService; + @Transactional(rollbackFor = Exception.class) @Override @@ -108,6 +141,116 @@ personService.updatePerson(person); } + + /** + * 员工导入 + * + * @param list 员工集合 + */ +// @CacheEvict(value = {"IRIS"},allEntries = true, beforeInvocation=true) + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData personImport(List list, Object... args) throws Exception{ + List results = new ArrayList<>(); + List personList = new ArrayList<>(); + List deptList = commonDeptService.getDeptByTips(null); + Person person = new Person(); + //处理人员信息 + int index = 2; + try { + for (PersonAtdDTO personDto : list) { + person = new Person(); + + // 判断部门信息 + if (ToolUtil.isEmpty(personDto.getDeptName())) { + results.add("第" + index + "行,部门不能为空"); + break; + }else { + for (Dept dept : deptList) { + if (personDto.getDeptName().equals(dept.getSimplename())){ + person.setDeptid(dept.getId()); + break; + } + } + if(ToolUtil.isEmpty(person.getDeptid())){ + results.add("第" + index + "行,部门信息不正确"); + break; + } + } + + if (ToolUtil.isEmpty(personDto.getName())) { + results.add("第" + index + "行,姓名不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getIdCardNo())) { + results.add("第" + index + "行,身份证号不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getInitAnnualLeave())) { + results.add("第" + index + "行,年假天数不能为空"); + break; + } else if (ToolUtil.isEmpty(personDto.getAnnualLeave())) { + results.add("第" + index + "行,剩余年假天数不能为空"); + break; + } else { + Long deptid = person.getDeptid(); + person = personDto.toPerson(); + person.setDeptid(deptid); + person.setPersonType(PersonTypeEnums.STAFF.getValue()); + person.setOprationId(permissionService.getCurrLoginUser().getId()); + // 根据身份证号得到生日和性别 + String idCardNo = personDto.getIdCardNo(); + String birth = ""; + if (idCardNo.length() == 15) birth = "19" + idCardNo.substring(6, 8)+"-"+idCardNo.substring(8,10)+"-"+idCardNo.substring(10,12); + else if (idCardNo.length() == 18) + { + birth = idCardNo.substring(6, 10)+"-"+idCardNo.substring(10,12)+"-"+idCardNo.substring(12,14); + if ((Convert.toInt(idCardNo.substring(16, 17)) % 2) == 1)//奇数 + { + person.setSex("1"); + } + else person.setSex("2"); + } + person.setBirthday(Date.valueOf(birth)); + + irisPersonService.insert(person); + } + index++; + } + } catch(DuplicateKeyException e){ + e.printStackTrace(); + GunsException gunsException = new GunsException(BizExceptionEnum.SERVER_ERROR); + gunsException.setMessage(e.getMessage().contains("ID_CARD_INDEX") ? "身份证号重复" : "人员编码重复"); + throw gunsException; + } + return ToolUtil.isEmpty(results) ? ResponseData.success() : ResponseData.error(results.get(0)); + } + + /** + * 文件流解析 + * + * @param file 导入文件 + * @return 特殊考勤日信息 + */ + @Override + public ResponseData parseSourceFile(MultipartFile file) throws Exception { + + //解析文件流 + List personDtoList = new ArrayList<>(); + InputStream in = file.getInputStream(); + ExcelIO.read(in, mapperExcel, PersonAtdDTO.class, (row) -> { + if (row.getSheet() == 0) { + if (row.getResult() != null) { + PersonAtdDTO personDto = row.getResult(); + personDtoList.add(personDto); + } + } else { + //其他sheet停止读取 + logger.info("人员信息导入" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + return ResponseData.success(personDtoList); + } + private void wrap(Map map) { map.put("deptName", permissionService.getDeptName((Serializable) map.get("deptid"))); if (ToolUtil.isNotEmpty(map.get(IrisPersonConst.PERSON_SEX_KEY))) { diff --git a/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java new file mode 100644 index 0000000..a39eb1e --- /dev/null +++ b/casic-iris-register/src/main/java/com/casic/missiles/modular/register/warpper/IrisPersonWarpper.java @@ -0,0 +1,68 @@ +package com.casic.missiles.modular.register.warpper; + + +import com.casic.missiles.core.base.warpper.BaseControllerWarpper; +import com.casic.missiles.core.common.service.ICommonPermissionService; +import com.casic.missiles.core.util.SpringContextHolder; +import com.casic.missiles.core.util.ToolUtil; +import org.springframework.beans.factory.annotation.Value; + +import java.text.SimpleDateFormat; +import java.util.Map; + +/** + * 人员的包装类 + * + * @date 2019年12月5日10:59:02 + */ +public class IrisPersonWarpper extends BaseControllerWarpper { + + + public IrisPersonWarpper(Object list) { + super(list); + } + ICommonPermissionService service = SpringContextHolder.getBean(ICommonPermissionService.class); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + @Override + public void warpTheMap(Map map) { + + Map mapExt = (Map)map.get("ext"); + //是否考勤 + if (!ToolUtil.isEmpty(mapExt.get("isKaoqin"))) { + if(mapExt.get("isKaoqin").equals("1")) { + map.put("isKaoqinName", "是"); + }else { + map.put("isKaoqinName", "否"); + } + } + //是否统计加班 + if (!ToolUtil.isEmpty(mapExt.get("isOt"))) { + if(mapExt.get("isOt").equals("1")) { + map.put("isOtName", "是"); + }else { + map.put("isOtName", "否"); + } + } + //是否专务 + if (!ToolUtil.isEmpty(mapExt.get("isZhuanwu"))) { + if(mapExt.get("isZhuanwu").equals("1")) { + map.put("isZhuanwuName", "是"); + }else { + map.put("isZhuanwuName", "否"); + } + } + //是否正职领导 + if (!ToolUtil.isEmpty(mapExt.get("isLeader"))) { + if(mapExt.get("isLeader").equals("1")) { + map.put("isLeaderName", "是"); + }else { + map.put("isLeaderName", "否"); + } + } + + + + } + +} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 464d675..71b3a85 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -122,6 +122,11 @@ casic-iris-register ${pro.version}
+ + com.casic + casic-iris-atd + ${pro.version} + org.springframework.boot diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 1423ba3..3ef2e8e 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,5 +1,6 @@ package com.casic.missiles; +import com.casic.missiles.modular.system.task.GenerateReportTask; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; @@ -10,6 +11,10 @@ import java.io.FileNotFoundException; +import java.lang.reflect.GenericArrayType; +import java.text.ParseException; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; /** * SpringBoot方式启动类 @@ -24,10 +29,13 @@ private static final Logger logger = LoggerFactory.getLogger(CasicApplication.class); - public static void main(String[] args) throws FileNotFoundException { + public static void main(String[] args) throws FileNotFoundException, ParseException { + SpringApplication.run(CasicApplication.class, args); logger.info("GunsApplication is success!"); +// GenerateReportTask task = new GenerateReportTask(); +// task.generateTask(); } } diff --git a/casic-web/src/main/resources/application.yml b/casic-web/src/main/resources/application.yml index 17b9bba..c80502c 100644 --- a/casic-web/src/main/resources/application.yml +++ b/casic-web/src/main/resources/application.yml @@ -21,4 +21,4 @@ server: tomcat: - max-http-post-size: -1 + max-http-post-size: -1 \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index ffffcff..aa5bf12 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -3,9 +3,9 @@ ################### spring配置 ################### spring: datasource: - url: jdbc:mysql://139.198.16.38:8098/casic_iris_temperature?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + url: jdbc:mysql://111.198.10.15:11102/casic_iris_temperature?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull username: root - password: Casic203 + password: Casic203! initial-size: 2 min-idle: 1 #flowable数据源和多数据源配置 @@ -18,11 +18,13 @@ recServicePort: 20004 sync: cron: "0 0 1 * * ?" #每天凌晨1点执行一次 + generate: + cron: "0 08 18 * * ?" #每天凌晨4点执行一次 jdbc: - port: 8098 + port: 11102 dbName: casic_iris_temperature userName: root - userPwd: Casic203 + userPwd: Casic203! mybatis-plus: global-config: sql-injector: com.casic.missiles.modular.metadata.inject.MetaSqlInject @@ -36,3 +38,4 @@ socket-port: 8000 config: export-path: D:\java\boot\casic-web-1.0.0-SNAPSHOT\export\ + static-location: C:\casic\tmp\ diff --git a/casic-web/src/main/resources/ehcache.xml b/casic-web/src/main/resources/ehcache.xml index 78c82d8..6a2c583 100644 --- a/casic-web/src/main/resources/ehcache.xml +++ b/casic-web/src/main/resources/ehcache.xml @@ -53,6 +53,19 @@ memoryStoreEvictionPolicy="LFU" transactionalMode="off"> + + com.casic - casic-admin-support + casic-core ${casic.version} com.casic - casic-core + casic-admin-support ${casic.version} @@ -92,6 +93,11 @@ casic-iris-register ${casic.version} + + com.casic + casic-iris-atd + ${casic.version} +