From 17dfbda4241e33dfed09b661356a1d91c8ad4740 Mon Sep 17 00:00:00 2001 From: andy <1042025947@qq.com> Date: Fri, 28 Nov 2025 09:23:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E8=B5=84=E8=A1=A8=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E6=B2=B3=E5=8C=97=E4=BC=8A=E7=89=B9?= =?UTF-8?q?=E6=B1=87=E6=80=BB=E8=A1=A8,=20=E9=83=A8=E9=97=A8=E4=BA=BA?= =?UTF-8?q?=E6=95=B0=E8=A1=A8=20=E9=A4=90=E9=A5=AE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=20=E5=A2=9E=E5=8A=A0=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E7=BB=B4=E6=8A=A4=20=E8=80=83=E5=8B=A4?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E5=A2=9E=E5=8A=A0,=20=E8=B6=85=E8=BF=873?= =?UTF-8?q?=E5=A4=A9=E6=9C=AA=E6=89=93=E5=8D=A1=20=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=8F=90=E9=86=92=20=E6=96=B0=E5=A2=9E=E9=A4=90=E5=8E=85?= =?UTF-8?q?=E8=B4=B9=E7=94=A8=E7=BB=B4=E6=8A=A4=E6=A8=A1=E5=9D=97,=20?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E7=BB=B4=E6=8A=A4=20=E6=8B=9B=E5=BE=85?= =?UTF-8?q?=E8=B4=B9,=20=E7=A6=8F=E5=88=A9=E8=B4=B9=20=20=E9=A4=90?= =?UTF-8?q?=E5=88=B8=20=20=E6=B0=B4=E7=94=B5=E8=B4=B9,=20=E7=87=83?= =?UTF-8?q?=E6=B0=94=E8=B4=B9=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/RzAttendanceDetailMapper.java | 3 + .../service/RzAttendanceDetailService.java | 4 + .../impl/RzAttendanceDetailServiceImpl.java | 125 ++ .../evo/common/controller/TestController.java | 8 + .../java/com/evo/common/utils/ParamUtils.java | 17 + .../utils/poi/handler/ExcelNewUtils.java | 1019 +++++++++++++++++ .../controller/RzMealExpensesController.java | 70 ++ .../RzMealExpensesDetailController.java | 66 ++ .../domain/RzMealExpenses.java | 63 + .../domain/RzMealExpensesDetail.java | 43 + .../domain/vo/MealExpensesExportVo.java | 44 + .../mapper/RzMealExpensesDetailMapper.java | 23 + .../mapper/RzMealExpensesMapper.java | 21 + .../service/RzMealExpensesDetailService.java | 24 + .../service/RzMealExpensesService.java | 27 + .../impl/RzMealExpensesDetailServiceImpl.java | 76 ++ .../impl/RzMealExpensesServiceImpl.java | 151 +++ .../RzRestaurantDetailController.java | 37 +- .../restaurant/domain/RzRestaurantDetail.java | 83 +- .../mapper/RzRestaurantDetailMapper.java | 5 +- .../service/IRzRestaurantDetailService.java | 6 +- .../impl/RzRestaurantDetailServiceImpl.java | 24 +- .../com/evo/system/mapper/SysStaffMapper.java | 7 + .../java/com/evo/task/TaskController.java | 16 + .../attendance/RzAttendanceDetailMapper.xml | 7 +- .../RzMealExpensesDetailMapper.xml | 34 + .../personnelMatters/RzMealExpensesMapper.xml | 21 + .../restaurant/RzRestaurantDetailMapper.xml | 13 + .../mapper/system/SysStaffMapper.xml | 5 + 29 files changed, 1959 insertions(+), 83 deletions(-) create mode 100644 evo-admin/src/main/java/com/evo/common/utils/poi/handler/ExcelNewUtils.java create mode 100644 evo-admin/src/main/java/com/evo/personnelMatters/controller/RzMealExpensesController.java create mode 100644 evo-admin/src/main/java/com/evo/personnelMatters/controller/RzMealExpensesDetailController.java create mode 100644 evo-admin/src/main/java/com/evo/personnelMatters/domain/RzMealExpenses.java create mode 100644 evo-admin/src/main/java/com/evo/personnelMatters/domain/RzMealExpensesDetail.java create mode 100644 evo-admin/src/main/java/com/evo/personnelMatters/domain/vo/MealExpensesExportVo.java create mode 100644 evo-admin/src/main/java/com/evo/personnelMatters/mapper/RzMealExpensesDetailMapper.java create mode 100644 evo-admin/src/main/java/com/evo/personnelMatters/mapper/RzMealExpensesMapper.java create mode 100644 evo-admin/src/main/java/com/evo/personnelMatters/service/RzMealExpensesDetailService.java create mode 100644 evo-admin/src/main/java/com/evo/personnelMatters/service/RzMealExpensesService.java create mode 100644 evo-admin/src/main/java/com/evo/personnelMatters/service/impl/RzMealExpensesDetailServiceImpl.java create mode 100644 evo-admin/src/main/java/com/evo/personnelMatters/service/impl/RzMealExpensesServiceImpl.java create mode 100644 evo-admin/src/main/resources/mapper/personnelMatters/RzMealExpensesDetailMapper.xml create mode 100644 evo-admin/src/main/resources/mapper/personnelMatters/RzMealExpensesMapper.xml diff --git a/evo-admin/src/main/java/com/evo/attendance/mapper/RzAttendanceDetailMapper.java b/evo-admin/src/main/java/com/evo/attendance/mapper/RzAttendanceDetailMapper.java index 2f48706..79b9512 100644 --- a/evo-admin/src/main/java/com/evo/attendance/mapper/RzAttendanceDetailMapper.java +++ b/evo-admin/src/main/java/com/evo/attendance/mapper/RzAttendanceDetailMapper.java @@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List; +import java.util.Map; /** * 考勤明细Mapper接口 @@ -73,4 +74,6 @@ public interface RzAttendanceDetailMapper extends BaseMapper * @return 考勤明细集合 */ public RzAttendanceDetail selectLastRzAttendanceDetailByBk(@Param("staffId") Long staffId, @Param("buttonType") String buttonType, @Param("startDateTime") Date startDateTime, @Param("endDateTime") Date endDateTime); + + List> getThreeDayNotCheck(); } diff --git a/evo-admin/src/main/java/com/evo/attendance/service/RzAttendanceDetailService.java b/evo-admin/src/main/java/com/evo/attendance/service/RzAttendanceDetailService.java index 246f8c2..903fdd0 100644 --- a/evo-admin/src/main/java/com/evo/attendance/service/RzAttendanceDetailService.java +++ b/evo-admin/src/main/java/com/evo/attendance/service/RzAttendanceDetailService.java @@ -6,6 +6,7 @@ import com.evo.attendance.domain.RzAttendanceDetail; import com.evo.attendance.domain.vo.RzAttendanceDetailTimeLineVO; import org.apache.ibatis.annotations.Param; +import java.text.ParseException; import java.util.Date; import java.util.List; @@ -31,4 +32,7 @@ public interface RzAttendanceDetailService extends IService public RzAttendanceDetail selectLastWorkCardByStaffId(@Param("staffId") Long staffId); public List selectListByAttendanceId(Long attId); + + public void sendAttendanceDetail() throws ParseException; + } diff --git a/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceDetailServiceImpl.java b/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceDetailServiceImpl.java index eac5e0d..b3356d3 100644 --- a/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceDetailServiceImpl.java +++ b/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceDetailServiceImpl.java @@ -8,12 +8,31 @@ import com.evo.attendance.domain.vo.RzAttendanceDetailTimeLineVO; import com.evo.attendance.mapper.RzAttendanceDetailMapper; import com.evo.attendance.service.RzAttendanceDetailService; import com.evo.common.constant.Constants; +import com.evo.common.core.domain.entity.SysDept; +import com.evo.common.utils.Collections; import com.evo.common.utils.DateUtils; +import com.evo.common.utils.ParamUtils; +import com.evo.common.utils.StringUtils; +import com.evo.personnelMatters.domain.RzLeaveDetail; +import com.evo.personnelMatters.mapper.RzLeaveDetailMapper; +import com.evo.system.domain.SysStaff; +import com.evo.system.mapper.SysDeptMapper; +import com.evo.system.mapper.SysStaffMapper; +import com.evo.wechat.service.SendClientService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -25,8 +44,17 @@ import java.util.stream.Collectors; * @contact: 17330188597 * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 */ +@Slf4j @Service public class RzAttendanceDetailServiceImpl extends ServiceImpl implements RzAttendanceDetailService { + @Autowired + private SysDeptMapper sysDeptMapper; + @Resource + private SendClientService sendClientService; + @Autowired + RzLeaveDetailMapper rzLeaveDetailMapper; + @Autowired + private SysStaffMapper sysStaffMapper; @Override public RzAttendanceDetail addDetail(RzAttendance attendance, String rules, String sn, Date date, String remark) { @@ -94,4 +122,101 @@ public class RzAttendanceDetailServiceImpl extends ServiceImpl> threeDayNotCheckList = super.getBaseMapper().getThreeDayNotCheck(); + if(Collections.isNotEmpty(threeDayNotCheckList)){ + for (Map threeDayNotCheck : threeDayNotCheckList){ + //用户Id + Integer userId = Integer.valueOf(String.valueOf(threeDayNotCheck.get("userId"))); + //最后打卡时间 + System.out.println(threeDayNotCheck.get("lastDate")); + Date lastDateTme = DateUtils.parseDate(String.valueOf(threeDayNotCheck.get("lastDate")), "yyyy-MM-dd"); + //首先获取最后打卡时间到今天的所有天数 + List holidayDates = Collections.emptyList(); + //记录所有时间的年, 防止有跨年的情况 + List yearList = Collections.emptyList(); + Date currentDate = new Date(); + while (lastDateTme.compareTo(currentDate) <= 0){ + String date = sdfd.format(lastDateTme); + String dateYear = date.substring(0,4); + if(!yearList.contains(dateYear)){ + yearList.add(dateYear); + } + holidayDates.add(date); + lastDateTme = DateUtils.addDays(lastDateTme,1); + } + //然后排除公休 排除法休 + for (String year : yearList){ + List holidays = Collections.findDuplicatesList(ParamUtils.getHoliddayList(Integer.valueOf(year), 0), holidayDates); + if(Collections.isNotEmpty(holidays)){ + holidayDates.removeAll(holidays); + } + } + + //剩余时长> 3天, 继续检查请假 + if(holidayDates.size() > 3){ + //排除假期 + List leaveDays = Collections.emptyList(); + for (String holidayDate : holidayDates){ + if(!leaveDays.contains(holidayDate)){ + RzLeaveDetail rzLeaveDetail = rzLeaveDetailMapper.selectRzLeaveDetailByUserIdAndDate(Long.valueOf(userId), DateUtils.parseDate(holidayDate)); + if(rzLeaveDetail != null &&rzLeaveDetail.getLeaveStartTime() != null && rzLeaveDetail.getLeaveEndTime() != null){ + Date leaveStartDate = rzLeaveDetail.getLeaveStartTime(); + while (leaveStartDate.compareTo(rzLeaveDetail.getLeaveEndTime()) <= 0){ + String date = sdfd.format(leaveStartDate); + leaveDays.add(date); + leaveStartDate = DateUtils.addDays(leaveStartDate,1); + } + } + } + } + + List holidays = Collections.findDuplicatesList(leaveDays, holidayDates); + if(Collections.isNotEmpty(holidays)){ + holidayDates.removeAll(holidays); + } + //如果假期还是> 3天, 则准备推送 + if(holidayDates.size() > 3){ + SysStaff sysStaff = sysStaffMapper.selectById(userId); + if(sysStaff != null) { + SysDept sysDept = sysDeptMapper.selectById(sysStaff.getDeptId()); + String deptName = sysDept != null ? sysDept.getDeptName() : "未知"; + String userName = sysStaff.getName(); + // 查询人资办人员信息 + List rzb = sysStaffMapper.queryysStaffByDeptId(Collections.asList(28l)); + if(Collections.isNotEmpty(rzb)){ + for (SysStaff rz : rzb){ + sendAttendanceDetail(userName, deptName, rz.getOpenid()); + } + } + //查询部门负责人 + SysStaff leaderSysStaff = sysStaffMapper.selectLeaderSysStaffByDeptId(sysStaff.getDeptId()); + if(leaderSysStaff != null){ + sendAttendanceDetail(userName, deptName, leaderSysStaff.getOpenid()); + } + } + } + } + } + } + + } + + + + @Async + protected void sendAttendanceDetail(String userName, String deptName, String openId){ + try { + if(StringUtils.isNotEmpty(openId)){ + sendClientService.sendAbnormalAttendance(deptName,userName, "长时间未打卡", new Date(), openId); + } + } catch (Exception e) { + log.error("推送公众号打卡异常失败, 原因为: {}", e.getMessage(), e); + } + } } diff --git a/evo-admin/src/main/java/com/evo/common/controller/TestController.java b/evo-admin/src/main/java/com/evo/common/controller/TestController.java index 30b25ac..36c94ed 100644 --- a/evo-admin/src/main/java/com/evo/common/controller/TestController.java +++ b/evo-admin/src/main/java/com/evo/common/controller/TestController.java @@ -67,6 +67,14 @@ public class TestController { @Resource private GZHAccessTokenService gzhAccessTokenService; + /** + * 清洗加班 + */ + @GetMapping("/testSend") + public AjaxResult sendAttendanceDetail() throws ParseException { + rzAttendanceDetailService.sendAttendanceDetail(); + return AjaxResult.success(); + } /** * 清洗加班 diff --git a/evo-admin/src/main/java/com/evo/common/utils/ParamUtils.java b/evo-admin/src/main/java/com/evo/common/utils/ParamUtils.java index d61eb94..982a6b6 100644 --- a/evo-admin/src/main/java/com/evo/common/utils/ParamUtils.java +++ b/evo-admin/src/main/java/com/evo/common/utils/ParamUtils.java @@ -58,6 +58,23 @@ public class ParamUtils { this.rzHolidayService = rzHolidayService; } + /*** + * 获取餐厅的开放时间 + * @return + */ + public static Double getWaterUnitPrice(){ + RzSysParam param= paramService.getRzSysParam("餐厅水单价", "water_unit_price","5.03","餐厅水单价"); + return Double.valueOf(param.getParamValue()); + } + + /*** + * 获取餐厅的开放时间 + * @return + */ + public static Double getElectricityUnitPrice(){ + RzSysParam param= paramService.getRzSysParam("餐厅电单价", "electricity_unit_price","0.73","餐厅的开放就餐时间, 多个时间用,间隔"); + return Double.valueOf(param.getParamValue()); + } /*** * 获取餐厅的开放时间 diff --git a/evo-admin/src/main/java/com/evo/common/utils/poi/handler/ExcelNewUtils.java b/evo-admin/src/main/java/com/evo/common/utils/poi/handler/ExcelNewUtils.java new file mode 100644 index 0000000..53465a1 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/common/utils/poi/handler/ExcelNewUtils.java @@ -0,0 +1,1019 @@ +package com.evo.common.utils.poi.handler; + +import com.evo.common.annotation.Excel; +import com.evo.common.annotation.Excel.ColumnType; +import com.evo.common.annotation.Excel.Type; +import com.evo.common.annotation.Excels; +import com.evo.common.config.EvoConfig; +import com.evo.common.core.domain.AjaxResult; +import com.evo.common.core.text.Convert; +import com.evo.common.exception.CustomException; +import com.evo.common.utils.DateUtils; +import com.evo.common.utils.StringUtils; +import com.evo.common.utils.poi.ExcelUtil; +import com.evo.common.utils.reflect.ReflectUtils; +import org.apache.poi.hssf.usermodel.HSSFDateUtil; +import org.apache.poi.ss.formula.functions.T; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * Excel相关处理 + * + * @author ruoyi + */ +public class ExcelNewUtils{ + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + + /** + * 工作表标题 + */ + private String title; + + /** + * 工作表表尾 + */ + private String footer; + + /** + * 各个部门工作表名称 + */ + private List sheetNameList; + + /** + * 导出类型(EXPORT:导出数据;IMPORT:导入模板) + */ + private Type type; + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 样式列表 + */ + private Map styles; + + + /** + * 导入导出各个部门数据列表 + */ + private List> lists; + + /** + * 注解列表 + */ + private List fields; + + /** + * 实体对象 + */ + public Class clazz; + + private String fileName; + + public ExcelNewUtils(Class clazz) + { + this.clazz = clazz; + } + + // 默认单元格内容为数字时格式 + private static DecimalFormat df = new DecimalFormat("0"); + // 默认单元格格式化日期字符串 + private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 格式化数字 + private static DecimalFormat nf = new DecimalFormat("0.00"); + + public void init(String fileName, List> lists, List sheetNameList,String title,String footer, Type type){ + if(sheetNameList == null){ + sheetNameList = new ArrayList(); + } + this.fileName = fileName; + this.lists = lists; + this.sheetNameList = sheetNameList; + this.title = title; + this.footer = footer; + this.type = type; + createExcelField(); + createWorkbook(); + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(InputStream is) throws Exception + { + return importExcel(StringUtils.EMPTY, is); + } + + /** + * 对excel表单指定表格索引名转换成list + * + * @param sheetName 表格索引名 + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(String sheetName, InputStream is) throws Exception + { + this.type = Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + Sheet sheet = null; + if (StringUtils.isNotEmpty(sheetName)) + { + // 如果指定sheet名,则取指定sheet中的内容. + sheet = wb.getSheet(sheetName); + } + else + { + // 如果传入的sheet名不存在则默认指向第1个sheet. + sheet = wb.getSheetAt(0); + } + + if (sheet == null) + { + throw new IOException("文件sheet不存在"); + } + + int rows = sheet.getPhysicalNumberOfRows(); + + if (rows > 0) + { + // 定义一个map用于存放excel列的序号和field. + Map cellMap = new HashMap(); + // 获取表头 + Row heard = sheet.getRow(0); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) + { + Cell cell = heard.getCell(i); + if (StringUtils.isNotNull(cell)) + { + String value = this.getCellValue(heard, i).toString(); + cellMap.put(value, i); + } + else + { + cellMap.put(null, i); + } + } + // 有数据时才处理 得到类的所有field. + Field[] allFields = clazz.getDeclaredFields(); + // 定义一个map用于存放列的序号和field. + Map fieldsMap = new HashMap(); + for (int col = 0; col < allFields.length; col++) + { + Field field = allFields[col]; + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + // 设置类的私有字段属性可访问. + field.setAccessible(true); + Integer column = cellMap.get(attr.name()); + fieldsMap.put(column, field); + } + } + for (int i = 1; i < rows; i++) + { + // 从第2行开始取数据,默认第一行是表头. + Row row = sheet.getRow(i); + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) + { + Object val = this.getCellValue(row, entry.getKey()); + + // 如果不存在实例则新建. + entity = (entity == null ? clazz.newInstance() : entity); + // 从map中得到对应列的field. + Field field = fieldsMap.get(entry.getKey()); + // 取得类型,并根据对象类型设置值. + Class fieldType = field.getType(); + if (String.class == fieldType) + { + String s = Convert.toStr(val); + if (StringUtils.endsWith(s, ".0")) + { + val = StringUtils.substringBefore(s, ".0"); + } + else + { + val = Convert.toStr(val); + } + } + else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) + { + val = Convert.toInt(val); + } + else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) + { + val = Convert.toLong(val); + } + else if ((Double.TYPE == fieldType) || (Double.class == fieldType)) + { + val = Convert.toDouble(val); + } + else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) + { + val = Convert.toFloat(val); + } + else if (BigDecimal.class == fieldType) + { + val = Convert.toBigDecimal(val); + } + else if (Date.class == fieldType) + { + if (val instanceof String) + { + val = DateUtils.parseDate(val); + } + else if (val instanceof Double) + { + val = DateUtil.getJavaDate((Double) val); + } + } + if (StringUtils.isNotNull(fieldType)) + { + Excel attr = field.getAnnotation(Excel.class); + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) + { + propertyName = field.getName() + "." + attr.targetAttr(); + } + else if (StringUtils.isNotEmpty(attr.readConverterExp())) + { + val = reverseByExp(String.valueOf(val), attr.readConverterExp()); + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public AjaxResult exportExcel(String fileName, List> lists, List sheetNameList, String title, String footer){ + this.init(fileName, lists,sheetNameList,title,footer,Type.EXPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public AjaxResult exportExcel(){ + OutputStream out = null; + try{ + // 取出一共有多少个sheet. + double sheetNo = 0; + sheetNo = sheetNameList.size(); + List fields2 = new ArrayList<>(); + fields2.addAll(fields); + + for (int index = 0; index < sheetNo; index++){ + createSheet(sheetNo, index); + //sheet1和后边的sheet表头不一致,所以需要分开处理 + // 产生一行 + Row row = sheet.createRow(0); + sheet.addMergedRegion(new CellRangeAddress(0,0,0,fields2.size()-1)); + Cell cell = row.createCell(0); + cell.setCellStyle(styles.get("title")); + + cell.setCellValue(this.title+"("+this.sheetNameList.get(index)+")"); + + int column = 0; + // 写入各个字段的列头名称 + row = sheet.createRow(1); + // 写入各个字段的列头名称 + //当index为0时,默认是第一个sheet,需要把list[1]姓名列删掉 + for (int i = 0; i < fields2.size();i++){ + Object[] os = fields2.get(i); + Excel excel = (Excel) os[1]; + Boolean show = excel.showAllSheet() ? true : (index == 0 && excel.showViewHome()) || (index != 0 && !excel.showViewHome()); + if(show){ + this.createCell(excel, row, column++,index); + } + } + // 产生一行 + Integer lastIndex = this.lists.get(index).size()+5; + Row rows = sheet.createRow( lastIndex); + sheet.addMergedRegion(new CellRangeAddress(lastIndex,lastIndex,0,fields2.size()-1)); + Cell cells = rows.createCell(0); + cells.setCellStyle(styles.get("footer")); + cells.setCellValue(this.footer); + + if (Type.EXPORT.equals(type)){ + fillExcelData(index, row); + } + } + String filename = encodingFilename(fileName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return AjaxResult.success(filename); + }catch (Exception e){ + e.printStackTrace(); + log.error("导出Excel异常{}", e.getMessage()); + throw new CustomException("导出Excel失败,请联系网站管理员!"); + } + finally{ + if (wb != null) + { + try + { + wb.close(); + } + catch (IOException e1) + { + e1.printStackTrace(); + } + } + if (out != null) + { + try + { + out.close(); + } + catch (IOException e1) + { + e1.printStackTrace(); + } + } + } + } + + /** + * 填充excel数据 + * + * @param index 序号 + * @param row 单元格行 + */ + public void fillExcelData(int index, Row row){ + int startNo = 0; + int endNo = Math.min(startNo + sheetSize, lists.get(index).size()); + List list = this.lists.get(index); + for (int i = startNo; i < endNo; i++){ + row = sheet.createRow(i + 2 - startNo); + // 得到导出对象. + T vo = (T) list.get(i); + int column = 0; + //当index为0时,默认是第一个sheet,需要把list[1]姓名列删掉 + List fields2 = new ArrayList<>(); + fields2.addAll(fields); + for (Object[] os : fields2){ + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + Boolean show = excel.showAllSheet() ? true : (index == 0 && excel.showViewHome()) || (index != 0 && !excel.showViewHome()); + if(show){ + // 设置实体类私有属性可访问 + field.setAccessible(true); + this.addCell(excel, row, vo, field, column++,index); + } + } + } + } + + /** + * 创建表格样式 + * + * @param wb 工作薄对象 + * @return 样式列表 + */ + private Map createStyles(Workbook wb) + { + // 写入各条记录,每条记录对应excel表中的一行 + Map styles = new HashMap(); + CellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("宋体"); + dataFont.setFontHeightInPoints((short) 10); + style.setFont(dataFont); +// style.setWrapText(true);//自动换行 + styles.put("data", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font dataFonts = wb.createFont(); + dataFont.setFontName("宋体"); + dataFont.setFontHeightInPoints((short) 9); + style.setFont(dataFonts); + styles.put("datas", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); +// style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); +// style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("宋体"); + headerFont.setFontHeightInPoints((short) 11); +// headerFont.setBold(true); +// headerFont.setColor(IndexedColors.WHITE.getIndex()); + style.setFont(headerFont); + style.setWrapText(true);//自动换行 + styles.put("header", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("datas")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font footerFont = wb.createFont(); + footerFont.setFontName("宋体"); + footerFont.setFontHeightInPoints((short) 12); + style.setFont(footerFont); + styles.put("footer", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font titleFont = wb.createFont(); + titleFont.setFontName("宋体"); + titleFont.setFontHeightInPoints((short) 18); + style.setFont(titleFont); + styles.put("title", style); + + return styles; + } + + /** + * 创建单元格 + */ + public Cell createCell(Excel attr, Row row, int column,int index){ + // 创建列 + Cell cell = row.createCell(column); + // 写入列信息 + cell.setCellValue(attr.name()); + setDataValidation(attr, row, column,index); + cell.setCellStyle(styles.get("header")); + return cell; + } + + /** + * 设置单元格信息 + * + * @param value 单元格值 + * @param attr 注解相关 + * @param cell 单元格信息 + */ + public void setCellVo(Object value, Excel attr, Cell cell) + { + if (ColumnType.STRING == attr.cellType()) + { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix()); + } + else if (ColumnType.NUMERIC == attr.cellType()) + { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(Integer.parseInt(value + "")); + } + } + + /** + * 创建表格样式 + */ + public void setDataValidation(Excel attr, Row row, int column,int index){ +// if(index == 0){ +// if (attr.name().indexOf("注:") >= 0){ +// sheet.setColumnWidth(column, 6000); +// }else{ +// if(column==0){ +// // 设置列宽 +// sheet.setColumnWidth(column, (int) ((attr.width()) * 120)); +// }else if(column==2||column==3||column==4||column==6||column==7||column==9||column==11){ +// // 设置列宽 +// sheet.setColumnWidth(column, (int) ((attr.width()) * 115)); +// }else{ +// // 设置列宽 +// sheet.setColumnWidth(column, (int) ((attr.width()) * 130)); +// } +// row.setHeight((short) (attr.height() * 50)); +// } +// // 如果设置了提示信息则鼠标放上去提示. +// if (StringUtils.isNotEmpty(attr.prompt())){ +// // 这里默认设了2-101列提示. +// setXSSFPrompt(sheet, "", attr.prompt(), 1, 100, column, column); +// } +// // 如果设置了combo属性则本列只能选择不能输入 +// if (attr.combo().length > 0){ +// // 这里默认设了2-101列只能选择不能输入. +// setXSSFValidation(sheet, attr.combo(), 1, 100, column, column); +// } +// }else{ + if (attr.name().indexOf("注:") >= 0){ + sheet.setColumnWidth(column, 6000); + }else{ + if(column==0){ + // 设置列宽 + sheet.setColumnWidth(column, (int) ((attr.width()) * 120)); + }else if(column==2||column==3||column==4||column==6||column==7||column==9||column==11){ + // 设置列宽 + sheet.setColumnWidth(column, (int) ((attr.width()) * 100)); + }else{ + // 设置列宽 + sheet.setColumnWidth(column, (int) ((attr.width()) * 110)); + } + row.setHeight((short) (attr.height() * 50)); + } + // 如果设置了提示信息则鼠标放上去提示. + if (StringUtils.isNotEmpty(attr.prompt())){ + // 这里默认设了2-101列提示. + setXSSFPrompt(sheet, "", attr.prompt(), 1, 100, column, column); + } + // 如果设置了combo属性则本列只能选择不能输入 + if (attr.combo().length > 0){ + // 这里默认设了2-101列只能选择不能输入. + setXSSFValidation(sheet, attr.combo(), 1, 100, column, column); + } +// } + } + + /** + * 添加单元格 + */ + public Cell addCell(Excel attr, Row row, T vo, Field field, int column, int index){ + Cell cell = null; + try{ + // 设置行高 + row.setHeight((short) (attr.height() * 30)); + // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. + if (attr.isExport()){ + // 创建cell + cell = row.createCell(column); + cell.setCellStyle(styles.get("data")); + + // 用于读取对象中的属性 + Object value = getTargetValue(vo, field, attr); + String dateFormat = attr.dateFormat(); + String readConverterExp = attr.readConverterExp(); + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)){ + cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value)); + }else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)){ + cell.setCellValue(convertByExp(String.valueOf(value), readConverterExp)); + }else{ + // 设置列类型 + setCellVo(value, attr, cell); + } + } + } + catch (Exception e) + { + log.error("导出Excel失败{}", e); + } + return cell; + } + + /** + * 设置 POI XSSFSheet 单元格提示 + * + * @param sheet 表单 + * @param promptTitle 提示标题 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setXSSFPrompt(Sheet sheet, String promptTitle, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) + { + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = helper.createCustomConstraint("DD1"); + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + DataValidation dataValidation = helper.createValidation(constraint, regions); + dataValidation.createPromptBox(promptTitle, promptContent); + dataValidation.setShowPromptBox(true); + sheet.addValidationData(dataValidation); + } + + /** + * 设置某些列的值只能输入预制的数据,显示下拉框. + * + * @param sheet 要设置的sheet. + * @param textlist 下拉框显示的内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + * @return 设置好的sheet. + */ + public void setXSSFValidation(Sheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) + { + DataValidationHelper helper = sheet.getDataValidationHelper(); + // 加载下拉列表内容 + DataValidationConstraint constraint = helper.createExplicitListConstraint(textlist); + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + // 数据有效性对象 + DataValidation dataValidation = helper.createValidation(constraint, regions); + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + + sheet.addValidationData(dataValidation); + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @return 解析后值 + * @throws Exception + */ + public static String convertByExp(String propertyValue, String converterExp) throws Exception + { + try + { + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (itemArray[0].equals(propertyValue)) + { + return itemArray[1]; + } + } + } + catch (Exception e) + { + throw e; + } + return propertyValue; + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @return 解析后值 + * @throws Exception + */ + public static String reverseByExp(String propertyValue, String converterExp) throws Exception + { + try + { + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (itemArray[1].equals(propertyValue)) + { + return itemArray[0]; + } + } + } + catch (Exception e) + { + throw e; + } + return propertyValue; + } + + /** + * 编码文件名 + */ + public String encodingFilename(String filename) + { +// filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx"; + filename = filename + ".xlsx"; + return filename; + } + + /** + * 获取下载路径 + * + * @param filename 文件名称 + */ + public String getAbsoluteFile(String filename) + { + String downloadPath = EvoConfig.getDownloadPath() + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + + /** + * 获取bean中的属性值 + * + * @param vo 实体对象 + * @param field 字段 + * @param excel 注解 + * @return 最终的属性值 + * @throws Exception + */ + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception{ + Object o = field.get(vo); + if (StringUtils.isNotEmpty(excel.targetAttr())){ + String target = excel.targetAttr(); + if (target.indexOf(".") > -1){ + String[] targets = target.split("[.]"); + for (String name : targets){ + o = getValue(o, name); + } + }else{ + o = getValue(o, target); + } + } + return o; + } + + /** + * 以类的属性的get方法方法形式获取值 + * + * @param o + * @param name + * @return value + * @throws Exception + */ + private Object getValue(Object o, String name) throws Exception + { + if (StringUtils.isNotEmpty(name)) + { + Class clazz = o.getClass(); + String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1); + Method method = clazz.getMethod(methodName); + o = method.invoke(o); + } + return o; + } + + /** + * 得到所有定义字段 + */ + private void createExcelField() + { + this.fields = new ArrayList(); + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + for (Field field : tempFields) + { + // 单注解 + if (field.isAnnotationPresent(Excel.class)) + { + putToField(field, field.getAnnotation(Excel.class)); + } + + // 多注解 + if (field.isAnnotationPresent(Excels.class)) + { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel excel : excels) + { + putToField(field, excel); + } + } + } + } + + /** + * 放到字段集合中 + */ + private void putToField(Field field, Excel attr) + { + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + this.fields.add(new Object[] { field, attr }); + } + } + + /** + * 创建一个工作簿 + */ + public void createWorkbook() + { + this.wb = new SXSSFWorkbook(500); + } + + /** + * 创建工作表 + * + * @param sheetNo sheet数量 + * @param index 序号 + */ + public void createSheet(double sheetNo, int index){ + this.sheet = wb.createSheet(); + this.styles = createStyles(wb); + // 设置工作表的名称. + wb.setSheetName(index, sheetNameList.get(index)); + sheet.getPrintSetup().setPaperSize(PrintSetup.A4_PAPERSIZE); + //设置横向打印 + sheet.getPrintSetup().setLandscape(true); + } + + /** + * 获取单元格值 + * + * @param row 获取的行 + * @param column 获取单元格列号 + * @return 单元格值 + */ + public Object getCellValue(Row row, int column) + { + if (row == null) + { + return row; + } + Object val = ""; + try + { + Cell cell = row.getCell(column); + if (StringUtils.isNotNull(cell)) + { + if (cell.getCellTypeEnum() == CellType.NUMERIC || cell.getCellTypeEnum() == CellType.FORMULA) + { + val = cell.getNumericCellValue(); + if (HSSFDateUtil.isCellDateFormatted(cell)) + { + val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 + } + else + { + if ((Double) val % 1 > 0) + { + val = new DecimalFormat("0.00").format(val); + } + else + { + val = new DecimalFormat("0").format(val); + } + } + } + else if (cell.getCellTypeEnum() == CellType.STRING) + { + val = cell.getStringCellValue(); + } + else if (cell.getCellTypeEnum() == CellType.BOOLEAN) + { + val = cell.getBooleanCellValue(); + } + else if (cell.getCellTypeEnum() == CellType.ERROR) + { + val = cell.getErrorCellValue(); + } + + } + } + catch (Exception e) + { + return val; + } + return val; + } + + public static ArrayList> readExcel2007(Sheet sheet) { + if(sheet==null){ + return null; + } + try { + ArrayList> rowList = new ArrayList>(); + ArrayList colList; + Row row; + Cell cell; + Object value; + for (int i = sheet.getFirstRowNum(), rowCount = 0; rowCount < sheet.getPhysicalNumberOfRows(); i++) { + row = sheet.getRow(i); + colList = new ArrayList(); + if (row == null) { + // 当读取行为空时 + if (i != sheet.getPhysicalNumberOfRows()) {// 判断是否是最后一行 + rowList.add(colList); + } + continue; + } else { + rowCount++; + } + for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) { + cell = row.getCell(j); + if (cell == null || cell.getCellType() == CellType.BLANK) { + // 当该单元格为空 + if (j != row.getLastCellNum()) {// 判断是否是该行中最后一个单元格 + colList.add(""); + } + continue; + } + switch (cell.getCellType()) { + case STRING: + // System.out.println(i + "行" + j + " 列 is String + // type"); + value = cell.getStringCellValue(); + break; + case NUMERIC: + if ("@".equals(cell.getCellStyle().getDataFormatString())) { + value = df.format(cell.getNumericCellValue()); + } else if ("General".equals(cell.getCellStyle().getDataFormatString())) { + value = nf.format(cell.getNumericCellValue()); + } else { + value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())); + } + // System.out.println(i + "行" + j + // + " 列 is Number type ; DateFormt:" + // + value.toString()); + break; + case BOOLEAN: + // System.out.println(i + "行" + j + " 列 is Boolean + // type"); + value = Boolean.valueOf(cell.getBooleanCellValue()); + break; + case BLANK: + // System.out.println(i + "行" + j + " 列 is Blank type"); + value = ""; + break; + default: + // System.out.println(i + "行" + j + " 列 is default + // type"); + value = cell.toString(); + }// end switch + colList.add(value); + } // end for j + rowList.add(colList); + } // end for i + + return rowList; + } catch (Exception e) { + System.out.println("exception"); + return null; + } + } + + public static DecimalFormat getDf() { + return df; + } + + public static void setDf(DecimalFormat df) { + ExcelNewUtils.df = df; + } + + public static SimpleDateFormat getSdf() { + return sdf; + } + + public static void setSdf(SimpleDateFormat sdf) { + ExcelNewUtils.sdf = sdf; + } + + public static DecimalFormat getNf() { + return nf; + } + + public static void setNf(DecimalFormat nf) { + ExcelNewUtils.nf = nf; + } +} diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/controller/RzMealExpensesController.java b/evo-admin/src/main/java/com/evo/personnelMatters/controller/RzMealExpensesController.java new file mode 100644 index 0000000..d5e6e94 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/personnelMatters/controller/RzMealExpensesController.java @@ -0,0 +1,70 @@ +package com.evo.personnelMatters.controller; + +import com.evo.common.annotation.Log; +import com.evo.common.core.controller.BaseController; +import com.evo.common.core.domain.AjaxResult; +import com.evo.common.core.page.TableDataInfo; +import com.evo.common.enums.BusinessType; +import com.evo.personnelMatters.domain.RzMealExpenses; +import com.evo.personnelMatters.service.RzMealExpensesService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * RzMealExpensesController + * + * @author andy.shi + * @ClassName:RzMealExpensesController + * @date: 2025年11月26日 15:08 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@RestController +@RequestMapping("/meal/expenses") +public class RzMealExpensesController extends BaseController { + + @Resource + private RzMealExpensesService mealExpensesService; + + /** + */ + @PreAuthorize("@ss.hasPermi('meal:expenses:list')") + @GetMapping("/list") + public TableDataInfo list(RzMealExpenses mealExpenses) { + startPage(); + List list = mealExpensesService.selectList(mealExpenses); + return getDataTable(list); + } + + /** + * 获取员工管理详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:staff:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(mealExpensesService.getById(id)); + } + + /** + * 修改信息 + */ + @PreAuthorize("@ss.hasPermi('meal:expenses:edit')") + @Log(title = "餐费管理", businessType = BusinessType.UPDATE) + @PutMapping("/edit") + public AjaxResult edit(@RequestBody RzMealExpenses mealExpenses) + { + return success(mealExpensesService.updateRzMealExpenses(mealExpenses)); + } + + @PreAuthorize("@ss.hasPermi('meal:expenses:export')") + @Log(title = "餐费管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public AjaxResult export(RzMealExpenses mealExpenses){ + return mealExpensesService.export(mealExpenses); + } + + +} diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/controller/RzMealExpensesDetailController.java b/evo-admin/src/main/java/com/evo/personnelMatters/controller/RzMealExpensesDetailController.java new file mode 100644 index 0000000..45495dd --- /dev/null +++ b/evo-admin/src/main/java/com/evo/personnelMatters/controller/RzMealExpensesDetailController.java @@ -0,0 +1,66 @@ +package com.evo.personnelMatters.controller; + +import com.evo.common.annotation.Log; +import com.evo.common.core.controller.BaseController; +import com.evo.common.core.domain.AjaxResult; +import com.evo.common.core.page.TableDataInfo; +import com.evo.common.enums.BusinessType; +import com.evo.personnelMatters.domain.RzLeaveDetail; +import com.evo.personnelMatters.domain.RzMealExpenses; +import com.evo.personnelMatters.domain.RzMealExpensesDetail; +import com.evo.personnelMatters.service.RzMealExpensesDetailService; +import com.evo.personnelMatters.service.RzMealExpensesService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * RzMealExpensesController + * + * @author andy.shi + * @ClassName:RzMealExpensesController + * @date: 2025年11月26日 15:08 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@RestController +@RequestMapping("/meal/expenses/detail") +public class RzMealExpensesDetailController extends BaseController { + + @Resource + private RzMealExpensesDetailService mealExpensesDetailService; + + /** + */ + @PreAuthorize("@ss.hasPermi('meal:expensesDetail:list')") + @GetMapping("/list") + public TableDataInfo list(RzMealExpensesDetail mealExpensesDetail) { + startPage(); + List list = mealExpensesDetailService.selectList(mealExpensesDetail); + return getDataTable(list); + } + + /** + * 新增请假管理详情 + */ + @PreAuthorize("@ss.hasPermi('meal:expensesDetail:add')") + @Log(title = "请假管理详情", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody RzMealExpensesDetail mealExpensesDetail) + { + return success(mealExpensesDetailService.saveRzMealExpensesDetail(mealExpensesDetail)); + } + + /** + * 删除请假管理详情 + */ + @PreAuthorize("@ss.hasPermi('meal:expensesDetail:remove')") + @Log(title = "请假管理详情", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public AjaxResult remove(@PathVariable Long id) + { + return success(mealExpensesDetailService.removeRzMealExpensesDetail(id)); + } + +} diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/domain/RzMealExpenses.java b/evo-admin/src/main/java/com/evo/personnelMatters/domain/RzMealExpenses.java new file mode 100644 index 0000000..fd91e30 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/personnelMatters/domain/RzMealExpenses.java @@ -0,0 +1,63 @@ +package com.evo.personnelMatters.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.evo.common.annotation.Excel; +import com.evo.common.core.domain.BaseEntity; +import com.evo.common.utils.DateUtils; +import com.evo.common.utils.ParamUtils; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.Date; + +/** + * 餐费信息 rz_leave + * + * @author evo + * @date 2025-03-15 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RzMealExpenses extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** 年月 */ + @TableField("year_month_time") + private String yearMonthTime; + /** 水费 */ + private Double waterFee; + /** 水费单价 */ + private Double waterUnitPrice; + /** 水费用量 */ + private Double waterDosage; + /** 电费 */ + private Double electricityFee; + /** 电费单价 */ + private Double electricityUnitPrice; + /** 电费用量 */ + private Double electricityDosage; + /** 招待费 */ + private Double hospitalityFee; + /** 加班福利费 */ + private Double overtimeBenefits; + + + public RzMealExpenses() { + } + + public RzMealExpenses(String yearMonthTime, Double waterUnitPrice, Double electricityUnitPrice) { + this.yearMonthTime = yearMonthTime; + this.waterUnitPrice = waterUnitPrice; + this.electricityUnitPrice = electricityUnitPrice; + } +} diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/domain/RzMealExpensesDetail.java b/evo-admin/src/main/java/com/evo/personnelMatters/domain/RzMealExpensesDetail.java new file mode 100644 index 0000000..7dbb7ed --- /dev/null +++ b/evo-admin/src/main/java/com/evo/personnelMatters/domain/RzMealExpensesDetail.java @@ -0,0 +1,43 @@ +package com.evo.personnelMatters.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.evo.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 餐费详情信息 rz_leave + * + * @author evo + * @date 2025-03-15 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RzMealExpensesDetail extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Long expensesId; + /** 类型. 1 招待 2 加班福利 3餐券 */ + private Integer type; + /*** + * 餐券类型 早餐, 午餐 晚餐 + */ + private String mealVoucherType; + /*** + * 次数 + */ + private Integer num; + /** 单价 */ + private Double unitPrice; + + private Double totalPrice; + + private String companyName; + +} diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/domain/vo/MealExpensesExportVo.java b/evo-admin/src/main/java/com/evo/personnelMatters/domain/vo/MealExpensesExportVo.java new file mode 100644 index 0000000..ecc0483 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/personnelMatters/domain/vo/MealExpensesExportVo.java @@ -0,0 +1,44 @@ +package com.evo.personnelMatters.domain.vo; + +import com.evo.common.annotation.Excel; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class MealExpensesExportVo { + + @Excel(name = "项目") + private String productName; + @Excel(name = "刷脸次数", showAllSheet = false, showViewHome = false) + private Integer faceScanNum; + @Excel(name = "餐券次数", showAllSheet = false, showViewHome = false) + private String mealVoucherNum; + @Excel(name = "单价", showAllSheet = false,showViewHome = false) + private String unitPrice; + @Excel(name = "金额") + private BigDecimal totalAmount; + @Excel(name = "备注", showAllSheet = false, showViewHome = false) + private String remarks; + + private String companyName; + //招待费 + private String hospitalityFee; + //福利费 + private String welfareFee; + + + public MealExpensesExportVo() { + } + + public MealExpensesExportVo(String productName, BigDecimal totalAmount) { + this.productName = productName; + this.totalAmount = totalAmount; + } + + public MealExpensesExportVo(Integer faceScanNum, String mealVoucherNum, BigDecimal totalAmount) { + this.faceScanNum = faceScanNum; + this.mealVoucherNum = mealVoucherNum; + this.totalAmount = totalAmount; + } +} diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/mapper/RzMealExpensesDetailMapper.java b/evo-admin/src/main/java/com/evo/personnelMatters/mapper/RzMealExpensesDetailMapper.java new file mode 100644 index 0000000..605d957 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/personnelMatters/mapper/RzMealExpensesDetailMapper.java @@ -0,0 +1,23 @@ +package com.evo.personnelMatters.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.evo.personnelMatters.domain.RzMealExpenses; +import com.evo.personnelMatters.domain.RzMealExpensesDetail; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 请假管理Mapper接口 + * + * @author chenyj + * @date 2024-08-03 + */ +public interface RzMealExpensesDetailMapper extends BaseMapper +{ + + List selectAllList(RzMealExpensesDetail mealExpensesDetail); + + List> selectDetailMapByTime(@Param("month")String month); +} diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/mapper/RzMealExpensesMapper.java b/evo-admin/src/main/java/com/evo/personnelMatters/mapper/RzMealExpensesMapper.java new file mode 100644 index 0000000..03fea98 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/personnelMatters/mapper/RzMealExpensesMapper.java @@ -0,0 +1,21 @@ +package com.evo.personnelMatters.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.evo.personnelMatters.domain.RzLeave; +import com.evo.personnelMatters.domain.RzMealExpenses; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 请假管理Mapper接口 + * + * @author chenyj + * @date 2024-08-03 + */ +public interface RzMealExpensesMapper extends BaseMapper +{ + + List selectAllList(RzMealExpenses mealExpenses); +} diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/service/RzMealExpensesDetailService.java b/evo-admin/src/main/java/com/evo/personnelMatters/service/RzMealExpensesDetailService.java new file mode 100644 index 0000000..18ff6e6 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/personnelMatters/service/RzMealExpensesDetailService.java @@ -0,0 +1,24 @@ +package com.evo.personnelMatters.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.evo.personnelMatters.domain.RzMealExpenses; +import com.evo.personnelMatters.domain.RzMealExpensesDetail; + +import java.util.List; + +/** + * 请假管理Service接口 + * + * @author chenyj + * @date 2024-08-03 + */ +public interface RzMealExpensesDetailService extends IService +{ + /** + */ + public List selectList(RzMealExpensesDetail mealExpensesDetail); + + public Boolean saveRzMealExpensesDetail(RzMealExpensesDetail mealExpensesDetail); + + public Boolean removeRzMealExpensesDetail(Long id); +} diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/service/RzMealExpensesService.java b/evo-admin/src/main/java/com/evo/personnelMatters/service/RzMealExpensesService.java new file mode 100644 index 0000000..294204e --- /dev/null +++ b/evo-admin/src/main/java/com/evo/personnelMatters/service/RzMealExpensesService.java @@ -0,0 +1,27 @@ +package com.evo.personnelMatters.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.evo.common.core.domain.AjaxResult; +import com.evo.finance.domain.RzSalaryDetail; +import com.evo.personnelMatters.domain.RzLeave; +import com.evo.personnelMatters.domain.RzLeaveDetail; +import com.evo.personnelMatters.domain.RzMealExpenses; + +import java.util.List; + +/** + * 请假管理Service接口 + * + * @author chenyj + * @date 2024-08-03 + */ +public interface RzMealExpensesService extends IService +{ + /** + */ + public List selectList(RzMealExpenses rzMealExpenses); + + Boolean updateRzMealExpenses(RzMealExpenses rzMealExpenses); + + AjaxResult export(RzMealExpenses rzMealExpenses); +} diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/service/impl/RzMealExpensesDetailServiceImpl.java b/evo-admin/src/main/java/com/evo/personnelMatters/service/impl/RzMealExpensesDetailServiceImpl.java new file mode 100644 index 0000000..2ae4b99 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/personnelMatters/service/impl/RzMealExpensesDetailServiceImpl.java @@ -0,0 +1,76 @@ +package com.evo.personnelMatters.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.evo.common.utils.DataUtils; +import com.evo.personnelMatters.domain.RzMealExpenses; +import com.evo.personnelMatters.domain.RzMealExpensesDetail; +import com.evo.personnelMatters.mapper.RzMealExpensesDetailMapper; +import com.evo.personnelMatters.mapper.RzMealExpensesMapper; +import com.evo.personnelMatters.service.RzMealExpensesDetailService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * RzMealExpensesServiceImpl + * + * @author andy.shi + * @ClassName:RzMealExpensesServiceImpl + * @date: 2025年11月26日 15:15 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Service +public class RzMealExpensesDetailServiceImpl extends ServiceImpl implements RzMealExpensesDetailService { + + + @Resource + RzMealExpensesMapper mealExpensesMapper; + + @Override + public List selectList(RzMealExpensesDetail mealExpensesDetail) { + return getBaseMapper().selectAllList(mealExpensesDetail); + } + + @Override + public Boolean saveRzMealExpensesDetail(RzMealExpensesDetail mealExpensesDetail) { + Boolean result = false; + if(result = save(mealExpensesDetail)){ + RzMealExpenses rzMealExpenses = mealExpensesMapper.selectById(mealExpensesDetail.getExpensesId()); + if(rzMealExpenses != null){ + if(mealExpensesDetail.getType() == 1){ + rzMealExpenses.setHospitalityFee(DataUtils.findDefaultValue(rzMealExpenses.getHospitalityFee(), 0d)+DataUtils.findDefaultValue(mealExpensesDetail.getTotalPrice(),0d)); + }else if(mealExpensesDetail.getType() == 2){ + rzMealExpenses.setOvertimeBenefits(DataUtils.findDefaultValue(rzMealExpenses.getOvertimeBenefits(), 0d)+DataUtils.findDefaultValue(mealExpensesDetail.getTotalPrice(),0d)); + }else if(mealExpensesDetail.getType() == 3){ + //暂时不做处理 + } + result = mealExpensesMapper.updateById(rzMealExpenses) > 0; + } + } + return result; + } + + @Override + public Boolean removeRzMealExpensesDetail(Long id) { + RzMealExpensesDetail mealExpensesDetail = getById(id); + if(mealExpensesDetail != null){ + RzMealExpenses rzMealExpenses = mealExpensesMapper.selectById(mealExpensesDetail.getExpensesId()); + if(rzMealExpenses != null){ + if(mealExpensesDetail.getType() == 1){ + rzMealExpenses.setHospitalityFee(DataUtils.findDefaultValue(rzMealExpenses.getHospitalityFee(), 0d)-DataUtils.findDefaultValue(mealExpensesDetail.getTotalPrice(),0d)); + if(rzMealExpenses.getHospitalityFee().compareTo(0d) < 0){ + rzMealExpenses.setHospitalityFee(0d); + } + }else if(mealExpensesDetail.getType() == 2){ + rzMealExpenses.setOvertimeBenefits(DataUtils.findDefaultValue(rzMealExpenses.getOvertimeBenefits(), 0d)-DataUtils.findDefaultValue(mealExpensesDetail.getTotalPrice(),0d)); + }else if(mealExpensesDetail.getType() == 3){ + //暂时不做处理 + } + mealExpensesMapper.updateById(rzMealExpenses); + } + } + return removeById(mealExpensesDetail); + } + +} diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/service/impl/RzMealExpensesServiceImpl.java b/evo-admin/src/main/java/com/evo/personnelMatters/service/impl/RzMealExpensesServiceImpl.java new file mode 100644 index 0000000..e54b262 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/personnelMatters/service/impl/RzMealExpensesServiceImpl.java @@ -0,0 +1,151 @@ +package com.evo.personnelMatters.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.evo.common.core.domain.AjaxResult; +import com.evo.common.utils.Collections; +import com.evo.common.utils.DataUtils; +import com.evo.common.utils.ParamUtils; +import com.evo.common.utils.SecurityUtils; +import com.evo.common.utils.poi.handler.ExcelNewUtils; +import com.evo.personnelMatters.domain.RzMealExpenses; +import com.evo.personnelMatters.domain.vo.MealExpensesExportVo; +import com.evo.personnelMatters.mapper.RzMealExpensesDetailMapper; +import com.evo.personnelMatters.mapper.RzMealExpensesMapper; +import com.evo.personnelMatters.service.RzMealExpensesService; +import com.evo.restaurant.mapper.RzRestaurantDetailMapper; +import com.evo.system.mapper.SysDictDataMapper; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * RzMealExpensesServiceImpl + * + * @author andy.shi + * @ClassName:RzMealExpensesServiceImpl + * @date: 2025年11月26日 15:15 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Service +public class RzMealExpensesServiceImpl extends ServiceImpl implements RzMealExpensesService { + + @Resource + private SysDictDataMapper sysDictDataMapper; + @Resource + private RzRestaurantDetailMapper rzRestaurantDetailMapper; + @Resource + private RzMealExpensesDetailMapper mealExpensesDetailMapper; + + @Override + public List selectList(RzMealExpenses mealExpenses) { + return getBaseMapper().selectAllList(mealExpenses); + } + + @Override + public Boolean updateRzMealExpenses(RzMealExpenses rzMealExpenses) { + rzMealExpenses.setWaterFee(new BigDecimal(DataUtils.findDefaultValue(rzMealExpenses.getWaterDosage(), 0d)).multiply(new BigDecimal(DataUtils.findDefaultValue(rzMealExpenses.getWaterUnitPrice(), ParamUtils.getWaterUnitPrice()))).setScale(2, BigDecimal.ROUND_HALF_UP ).doubleValue()); + rzMealExpenses.setElectricityFee(new BigDecimal(DataUtils.findDefaultValue(rzMealExpenses.getElectricityDosage(), 0d)).multiply(new BigDecimal(DataUtils.findDefaultValue(rzMealExpenses.getElectricityUnitPrice(), ParamUtils.getElectricityUnitPrice()))).setScale(2, BigDecimal.ROUND_HALF_UP ).doubleValue()); + return updateById(rzMealExpenses); + } + + public static MealExpensesExportVo sumMealExpensesExportVo(List list){ + if(Collections.isEmpty(list)){ + return new MealExpensesExportVo(BigDecimal.ZERO.intValue(), BigDecimal.ZERO.toString(), BigDecimal.ZERO); + } + MealExpensesExportVo result = list.stream().reduce((x, y) -> new MealExpensesExportVo( + new BigDecimal(x.getFaceScanNum()).add(new BigDecimal(y.getFaceScanNum())).intValue(), + new BigDecimal(x.getMealVoucherNum()).add(new BigDecimal(y.getMealVoucherNum())).toString(),(x.getTotalAmount().add(y.getTotalAmount())))).orElse(new MealExpensesExportVo(BigDecimal.ZERO.intValue(), BigDecimal.ZERO.toString(), BigDecimal.ZERO)); + //添加此处的原因是, 如果部门中, 有且只有1人的情况下, stream().reduce() 不会创建新的对象, 只是把唯一的对象返回了,, 会对后续的数据展示产生影响, 所以重新创new新对象 + return result; + } + + @Override + public AjaxResult export(RzMealExpenses rzMealExpenses) { + ExcelNewUtils util = new ExcelNewUtils(MealExpensesExportVo.class); + + List excelResult = buildExportData(rzMealExpenses); + + RzMealExpenses mealExpenses = getOne(new LambdaQueryWrapper().eq(RzMealExpenses::getYearMonthTime, rzMealExpenses.getYearMonthTime()),false); + + + Map> companyDataList = excelResult.stream().collect(Collectors.groupingBy(MealExpensesExportVo::getCompanyName)); + //公司名字 + List sheetCompanyNames = Collections.asList(companyDataList.keySet()); + sheetCompanyNames.set(0, "汇总"); + + List indexDataList = Collections.emptyList(); + + List> companyLists = new ArrayList<>(); + for (String sheetCompanyName : sheetCompanyNames){ + List dataList = companyDataList.get(sheetCompanyName); + if(Collections.isEmpty(dataList)){ + companyLists.add(Collections.emptyList()); + continue; + } + MealExpensesExportVo total = sumMealExpensesExportVo(dataList); + total.setProductName("小计"); + dataList.add(total); + if(sheetCompanyName.equals("河北伊特")){ + BigDecimal total1 = total.getTotalAmount(); + dataList.add(new MealExpensesExportVo("招待费", new BigDecimal(mealExpenses.getHospitalityFee()).setScale(2, BigDecimal.ROUND_HALF_UP))); + total1 = total1.add(new BigDecimal(mealExpenses.getHospitalityFee())).setScale(2, BigDecimal.ROUND_HALF_UP); + + dataList.add(new MealExpensesExportVo("福利费", new BigDecimal(mealExpenses.getOvertimeBenefits()).setScale(2, BigDecimal.ROUND_HALF_UP))); + total1.add(new BigDecimal(mealExpenses.getOvertimeBenefits())).setScale(2, BigDecimal.ROUND_HALF_UP); + + dataList.add(new MealExpensesExportVo("水费", new BigDecimal(mealExpenses.getWaterFee()).setScale(2, BigDecimal.ROUND_HALF_UP))); + total1 = total1.subtract(new BigDecimal(mealExpenses.getWaterFee())).setScale(2, BigDecimal.ROUND_HALF_UP); + + dataList.add(new MealExpensesExportVo("电费", new BigDecimal(mealExpenses.getElectricityFee()).setScale(2, BigDecimal.ROUND_HALF_UP))); + total1 = total1.subtract(new BigDecimal(mealExpenses.getElectricityFee()).setScale(2, BigDecimal.ROUND_HALF_UP)); + + dataList.add(new MealExpensesExportVo("合计", total1)); + + indexDataList.add(new MealExpensesExportVo(sheetCompanyName+rzMealExpenses.getYearMonthTime()+"月餐费结算清单", new BigDecimal(mealExpenses.getElectricityFee()).setScale(2, BigDecimal.ROUND_HALF_UP))); + }else{ + indexDataList.add(new MealExpensesExportVo(sheetCompanyName+rzMealExpenses.getYearMonthTime()+"月餐费结算清单", total.getTotalAmount().setScale(2, BigDecimal.ROUND_HALF_UP))); + } + companyLists.add(dataList); + } + companyLists.set(0, indexDataList); + String name = ""; + try { + name = SecurityUtils.getUsername(); + } catch (Exception e) { + } + + return util.exportExcel(rzMealExpenses.getYearMonthTime()+"月餐费结算清单",companyLists, sheetCompanyNames, rzMealExpenses.getYearMonthTime()+"月餐费结算清单", "制表: "+name+" "+"审核: "+"经理签字: "+"总经理签字:"); + + } + private List buildExportData(RzMealExpenses mealExpenses) { + //查询餐饮详情 + List> detailListMap = rzRestaurantDetailMapper.selectDetailAllListMap(mealExpenses.getYearMonthTime()); + //查询餐券详情 + List> detailList = mealExpensesDetailMapper.selectDetailMapByTime(mealExpenses.getYearMonthTime()); + //数据转换 + Map> detailMap = detailList.stream().collect(Collectors.toMap(d-> String.valueOf(d.get("companyName")), d->d, (k1,k2)->k1)); + List voResult = Collections.emptyList(); + detailListMap.forEach(detail -> { + Map dm = detailMap.get(String.valueOf(detail.get("companyName"))); + MealExpensesExportVo exportVo = new MealExpensesExportVo(); + exportVo.setProductName(String.valueOf(detail.get("productName"))); + exportVo.setFaceScanNum(Integer.valueOf(String.valueOf(detail.get("faceScanNum")))); + exportVo.setUnitPrice(String.valueOf(detail.get("unitPrice"))); + exportVo.setCompanyName(String.valueOf(detail.get("companyName"))); + if(Collections.isNotEmpty(dm)){ + exportVo.setMealVoucherNum(String.valueOf(DataUtils.findDefaultValue(dm.get(String.valueOf(detail.get("productName"))), 0))); + }else { + exportVo.setMealVoucherNum("0"); + } + exportVo.setTotalAmount((new BigDecimal(exportVo.getFaceScanNum()).add(new BigDecimal(DataUtils.findDefaultValue(exportVo.getMealVoucherNum(), "0")))).multiply(new BigDecimal(exportVo.getUnitPrice())).setScale(2, BigDecimal.ROUND_HALF_UP)); + voResult.add(exportVo); + }); + return voResult; + } +} diff --git a/evo-admin/src/main/java/com/evo/restaurant/controller/RzRestaurantDetailController.java b/evo-admin/src/main/java/com/evo/restaurant/controller/RzRestaurantDetailController.java index eba4712..03d7cb7 100644 --- a/evo-admin/src/main/java/com/evo/restaurant/controller/RzRestaurantDetailController.java +++ b/evo-admin/src/main/java/com/evo/restaurant/controller/RzRestaurantDetailController.java @@ -1,18 +1,26 @@ package com.evo.restaurant.controller; import com.evo.common.annotation.Log; +import com.evo.common.constant.Constants; import com.evo.common.core.controller.BaseController; import com.evo.common.core.domain.AjaxResult; +import com.evo.common.core.domain.entity.SysUser; import com.evo.common.core.page.TableDataInfo; import com.evo.common.enums.BusinessType; +import com.evo.common.utils.DateUtils; +import com.evo.common.utils.SecurityUtils; +import com.evo.common.utils.StringUtils; import com.evo.common.utils.poi.ExcelUtil; import com.evo.restaurant.domain.RzRestaurantDetail; import com.evo.restaurant.service.IRzRestaurantDetailService; import com.evo.system.domain.SysStaff; +import com.evo.system.service.ISysStaffService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; +import java.util.Date; import java.util.List; /** @@ -27,7 +35,8 @@ public class RzRestaurantDetailController extends BaseController { @Autowired private IRzRestaurantDetailService rzRestaurantDetailService; - + @Autowired + private ISysStaffService sysStaffService; /** * 查询餐饮详情列表 */ @@ -85,5 +94,31 @@ public class RzRestaurantDetailController extends BaseController return getDataTable(list); } + /** + * 新增用户 + */ + @PreAuthorize("@ss.hasPermi('api:v2:add')") + @Log(title = "餐饮详情", businessType = BusinessType.INSERT) + @PostMapping("/save") + public AjaxResult add(@Validated @RequestBody RzRestaurantDetail rzRestaurantDetail) + { + rzRestaurantDetail.setName(sysStaffService.getById(rzRestaurantDetail.getStaffId()).getName()); + rzRestaurantDetail.setTime(getTime(rzRestaurantDetail)); + rzRestaurantDetail.setDelFlag(Constants.DELETE_FLAG_0); + return toAjax(rzRestaurantDetailService.saveRzRestaurantDetail(rzRestaurantDetail)); + } + + public Date getTime(RzRestaurantDetail rzRestaurantDetail){ + switch (rzRestaurantDetail.getSign()){ + case "早餐": + return DateUtils.setHours(rzRestaurantDetail.getDate(), 8); + case "午餐": + return DateUtils.setHours(rzRestaurantDetail.getDate(), 12); + case "晚餐": + return DateUtils.setHours(rzRestaurantDetail.getDate(), 18); + default: + return rzRestaurantDetail.getDate(); + } + } } diff --git a/evo-admin/src/main/java/com/evo/restaurant/domain/RzRestaurantDetail.java b/evo-admin/src/main/java/com/evo/restaurant/domain/RzRestaurantDetail.java index fed41b7..0a78092 100644 --- a/evo-admin/src/main/java/com/evo/restaurant/domain/RzRestaurantDetail.java +++ b/evo-admin/src/main/java/com/evo/restaurant/domain/RzRestaurantDetail.java @@ -1,8 +1,11 @@ package com.evo.restaurant.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.evo.common.annotation.Excel; import com.evo.common.core.domain.BaseEntity; import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -14,11 +17,13 @@ import java.util.Date; * @author chenyj * @date 2024-09-18 */ +@Data public class RzRestaurantDetail extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Long id; //员工ID private Long staffId; @@ -49,84 +54,6 @@ public class RzRestaurantDetail extends BaseEntity /** 删除标记 */ private String delFlag; - public Date getMonth() { - return month; - } - - public void setMonth(Date month) { - this.month = month; - } - - public Long getStaffId() { - return staffId; - } - - public void setStaffId(Long staffId) { - this.staffId = staffId; - } - - public int getNumber() { - return number; - } - - public void setNumber(int number) { - this.number = number; - } - - public void setId(Long id) - { - this.id = id; - } - - public Long getId() - { - return id; - } - public void setName(String name) - { - this.name = name; - } - - public String getName() - { - return name; - } - public void setDate(Date date) - { - this.date = date; - } - - public Date getDate() - { - return date; - } - public void setTime(Date time) - { - this.time = time; - } - - public Date getTime() - { - return time; - } - public void setSign(String sign) - { - this.sign = sign; - } - - public String getSign() - { - return sign; - } - public void setDelFlag(String delFlag) - { - this.delFlag = delFlag; - } - - public String getDelFlag() - { - return delFlag; - } @Override public String toString() { diff --git a/evo-admin/src/main/java/com/evo/restaurant/mapper/RzRestaurantDetailMapper.java b/evo-admin/src/main/java/com/evo/restaurant/mapper/RzRestaurantDetailMapper.java index 7e0fa41..9cc5fab 100644 --- a/evo-admin/src/main/java/com/evo/restaurant/mapper/RzRestaurantDetailMapper.java +++ b/evo-admin/src/main/java/com/evo/restaurant/mapper/RzRestaurantDetailMapper.java @@ -1,5 +1,6 @@ package com.evo.restaurant.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.evo.restaurant.domain.RzRestaurantDetail; import org.apache.ibatis.annotations.Param; @@ -13,7 +14,7 @@ import java.util.Map; * @author chenyj * @date 2024-09-18 */ -public interface RzRestaurantDetailMapper +public interface RzRestaurantDetailMapper extends BaseMapper { /** * 查询餐饮详情 @@ -47,4 +48,6 @@ public interface RzRestaurantDetailMapper public List> selectRzRestaurantDetailListMap(@Param("month") Date month); + + public List> selectDetailAllListMap(@Param("month") String month); } diff --git a/evo-admin/src/main/java/com/evo/restaurant/service/IRzRestaurantDetailService.java b/evo-admin/src/main/java/com/evo/restaurant/service/IRzRestaurantDetailService.java index 067a208..c15cb80 100644 --- a/evo-admin/src/main/java/com/evo/restaurant/service/IRzRestaurantDetailService.java +++ b/evo-admin/src/main/java/com/evo/restaurant/service/IRzRestaurantDetailService.java @@ -1,7 +1,9 @@ package com.evo.restaurant.service; +import com.baomidou.mybatisplus.extension.service.IService; import com.evo.common.core.domain.AjaxResult; import com.evo.restaurant.domain.RzRestaurantDetail; +import com.evo.system.domain.SysStaff; import java.util.List; @@ -11,7 +13,7 @@ import java.util.List; * @author chenyj * @date 2024-09-18 */ -public interface IRzRestaurantDetailService +public interface IRzRestaurantDetailService extends IService { /** @@ -22,6 +24,7 @@ public interface IRzRestaurantDetailService */ public List selectRzRestaurantDetailList(RzRestaurantDetail rzRestaurantDetail); + public Boolean saveRzRestaurantDetail(RzRestaurantDetail rzRestaurantDetail); /** * 新增餐饮详情 * @@ -30,6 +33,7 @@ public interface IRzRestaurantDetailService */ public String insertRzRestaurantDetail(String json); + /** * 当前时间的就餐人数 * @return diff --git a/evo-admin/src/main/java/com/evo/restaurant/service/impl/RzRestaurantDetailServiceImpl.java b/evo-admin/src/main/java/com/evo/restaurant/service/impl/RzRestaurantDetailServiceImpl.java index 4851c23..44a7497 100644 --- a/evo-admin/src/main/java/com/evo/restaurant/service/impl/RzRestaurantDetailServiceImpl.java +++ b/evo-admin/src/main/java/com/evo/restaurant/service/impl/RzRestaurantDetailServiceImpl.java @@ -1,6 +1,7 @@ package com.evo.restaurant.service.impl; import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.evo.common.constant.Constants; import com.evo.common.utils.ParamUtils; import com.evo.common.utils.StringUtils; @@ -30,7 +31,7 @@ import java.util.Map; * @date 2024-09-18 */ @Service -public class RzRestaurantDetailServiceImpl implements IRzRestaurantDetailService +public class RzRestaurantDetailServiceImpl extends ServiceImpl implements IRzRestaurantDetailService { @Resource private RzRestaurantDetailMapper rzRestaurantDetailMapper; @@ -52,6 +53,27 @@ public class RzRestaurantDetailServiceImpl implements IRzRestaurantDetailService { return rzRestaurantDetailMapper.selectRzRestaurantDetailList(rzRestaurantDetail); } + + @Override + public Boolean saveRzRestaurantDetail(RzRestaurantDetail rzRestaurantDetail) { + Boolean result = false; + if(result = save(rzRestaurantDetail)) { + RzRestaurantStatistics restaurantStatistics = rzRestaurantStatisticsMapper.selectRzRestaurantStatisticsByUserIdAndDate(Long.valueOf(rzRestaurantDetail.getStaffId()), rzRestaurantDetail.getDate()); + if (restaurantStatistics != null) { + switch (rzRestaurantDetail.getSign()) { + case "早餐": + restaurantStatistics.setBreakfastNumber(restaurantStatistics.getBreakfastNumber() + 1); + case "午餐": + restaurantStatistics.setLunchNumber(restaurantStatistics.getLunchNumber() + 1); + case "晚餐": + restaurantStatistics.setSupperNumber(restaurantStatistics.getSupperNumber() + 1); + } + result = rzRestaurantStatisticsMapper.updateRzRestaurantStatistics(restaurantStatistics) > 0; + } + } + return result; + } + /** * 新增餐饮详情 * diff --git a/evo-admin/src/main/java/com/evo/system/mapper/SysStaffMapper.java b/evo-admin/src/main/java/com/evo/system/mapper/SysStaffMapper.java index 0ccebb5..2bb6608 100644 --- a/evo-admin/src/main/java/com/evo/system/mapper/SysStaffMapper.java +++ b/evo-admin/src/main/java/com/evo/system/mapper/SysStaffMapper.java @@ -1,6 +1,7 @@ package com.evo.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.evo.common.utils.Collections; import com.evo.system.domain.SysStaff; import org.apache.ibatis.annotations.Param; @@ -80,5 +81,11 @@ s * @return * @return */ public List queryysStaffByDeptId(List list); + /*** + * 根据部门查询部门领导人 + * @param deptId + * @return + */ + SysStaff selectLeaderSysStaffByDeptId(Long deptId); } diff --git a/evo-admin/src/main/java/com/evo/task/TaskController.java b/evo-admin/src/main/java/com/evo/task/TaskController.java index 15403e5..2ef25e1 100644 --- a/evo-admin/src/main/java/com/evo/task/TaskController.java +++ b/evo-admin/src/main/java/com/evo/task/TaskController.java @@ -3,7 +3,11 @@ package com.evo.task; import com.evo.attendance.service.IRzAbnormalDetailService; import com.evo.attendance.service.IRzAttendanceService; import com.evo.attendance.service.IRzAttendanceStatisticalService; +import com.evo.attendance.service.RzAttendanceDetailService; import com.evo.common.utils.DateUtils; +import com.evo.common.utils.ParamUtils; +import com.evo.personnelMatters.domain.RzMealExpenses; +import com.evo.personnelMatters.service.RzMealExpensesService; import com.evo.restaurant.domain.RzRestaurantImages; import com.evo.restaurant.domain.RzRestaurantStatistics; import com.evo.restaurant.service.IRzRestaurantImagesService; @@ -14,6 +18,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.text.ParseException; import java.util.Date; import java.util.List; @@ -32,12 +37,18 @@ public class TaskController { private IRzRestaurantImagesService rzRestaurantImagesService; @Resource private IRzAttendanceService rzAttendanceService; + @Resource + private RzAttendanceDetailService rzAttendanceDetailService; + @Resource + private RzMealExpensesService rzMealExpensesService; /** * 每月1号 0:20 自动生成考勤数据 */ @Scheduled(cron = "0 20 0 1 * ?") public void autoCreateAttendanceData(){ sysStaffService.autoCreateAttendanceData(); + + rzMealExpensesService.save(new RzMealExpenses(DateUtils.parseDateToStr("yyyy-MM", new Date()), ParamUtils.getWaterUnitPrice(), ParamUtils.getElectricityUnitPrice())); }; /** * 每月1号 1:00 自动生成餐饮统计信息 @@ -101,6 +112,11 @@ public class TaskController { rzAttendanceService.sendAbnormalAttendance(); } + @Scheduled(cron = "0 0 10 * * ?") + public void autoAttendanceDetail() throws ParseException { + rzAttendanceDetailService.sendAttendanceDetail(); + } + // /** // * 每月10号2点自动计算工龄 // */ diff --git a/evo-admin/src/main/resources/mapper/attendance/RzAttendanceDetailMapper.xml b/evo-admin/src/main/resources/mapper/attendance/RzAttendanceDetailMapper.xml index a1220dc..952dad5 100644 --- a/evo-admin/src/main/resources/mapper/attendance/RzAttendanceDetailMapper.xml +++ b/evo-admin/src/main/resources/mapper/attendance/RzAttendanceDetailMapper.xml @@ -109,7 +109,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by date_time desc limit 1 - + diff --git a/evo-admin/src/main/resources/mapper/personnelMatters/RzMealExpensesDetailMapper.xml b/evo-admin/src/main/resources/mapper/personnelMatters/RzMealExpensesDetailMapper.xml new file mode 100644 index 0000000..81115d3 --- /dev/null +++ b/evo-admin/src/main/resources/mapper/personnelMatters/RzMealExpensesDetailMapper.xml @@ -0,0 +1,34 @@ + + + + + + select id, expenses_id, type, meal_voucher_type, num, total_price, unit_price, company_name, create_by, create_time, update_by, update_time from rz_meal_expenses_detail d + + + + + + + + diff --git a/evo-admin/src/main/resources/mapper/personnelMatters/RzMealExpensesMapper.xml b/evo-admin/src/main/resources/mapper/personnelMatters/RzMealExpensesMapper.xml new file mode 100644 index 0000000..62137fc --- /dev/null +++ b/evo-admin/src/main/resources/mapper/personnelMatters/RzMealExpensesMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + select id, year_month_time, water_unit_price, water_fee, water_dosage, electricity_unit_price, electricity_fee, hospitality_fee, electricity_dosage, overtime_benefits, create_by, create_time, update_by, update_time from rz_meal_expenses d + + + + diff --git a/evo-admin/src/main/resources/mapper/restaurant/RzRestaurantDetailMapper.xml b/evo-admin/src/main/resources/mapper/restaurant/RzRestaurantDetailMapper.xml index 441d049..014d2a2 100644 --- a/evo-admin/src/main/resources/mapper/restaurant/RzRestaurantDetailMapper.xml +++ b/evo-admin/src/main/resources/mapper/restaurant/RzRestaurantDetailMapper.xml @@ -88,6 +88,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and sign = #{sign} + + diff --git a/evo-admin/src/main/resources/mapper/system/SysStaffMapper.xml b/evo-admin/src/main/resources/mapper/system/SysStaffMapper.xml index 32ed1df..4a513ef 100644 --- a/evo-admin/src/main/resources/mapper/system/SysStaffMapper.xml +++ b/evo-admin/src/main/resources/mapper/system/SysStaffMapper.xml @@ -272,4 +272,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{deptId} + +