From 8f81390ff970c8783b9951881e3ebaa5350b7a96 Mon Sep 17 00:00:00 2001 From: hshansha Date: Wed, 21 May 2025 09:05:04 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E8=80=83=E5=8B=A4=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PayAttendanceController.java | 50 +- .../com/ruoyi/pay/domain/PayAttendance.java | 5 + .../ruoyi/pay/domain/bo/PayAttendanceBo.java | 5 + .../ruoyi/pay/domain/vo/PayAttendanceVo.java | 5 + .../ruoyi/pay/mapper/PayAttendanceMapper.java | 5 +- .../pay/service/IPayAttendanceService.java | 4 + .../impl/PayAttendanceServiceImpl.java | 88 +++ .../ruoyi/pay/util/AttendanceExcelUtil.java | 531 ++++++++++++++++++ 8 files changed, 688 insertions(+), 5 deletions(-) create mode 100644 ruoyi-pay/src/main/java/com/ruoyi/pay/util/AttendanceExcelUtil.java diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayAttendanceController.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayAttendanceController.java index 56aecef..2f84436 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayAttendanceController.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayAttendanceController.java @@ -1,9 +1,10 @@ package com.ruoyi.pay.controller; +import java.util.ArrayList; import java.util.List; import java.util.Arrays; -import java.util.concurrent.TimeUnit; - +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.pay.util.AttendanceExcelUtil; import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.*; @@ -17,13 +18,13 @@ import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; -import com.ruoyi.common.core.validate.QueryGroup; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.pay.domain.vo.PayAttendanceVo; import com.ruoyi.pay.domain.bo.PayAttendanceBo; import com.ruoyi.pay.service.IPayAttendanceService; import com.ruoyi.common.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; /** * 考勤 @@ -58,6 +59,39 @@ public class PayAttendanceController extends BaseController { List list = iPayAttendanceService.queryList(bo); ExcelUtil.exportExcel(list, "考勤", PayAttendanceVo.class, response); } + /** + * 导入考勤列表 + */ + @SaCheckPermission("pay:attendance:import") + @Log(title = "考勤", businessType = BusinessType.IMPORT) + @PostMapping("/import") + public R importData(MultipartFile file, boolean updateSupport,String date,String kaoqinType,Long tenantId) throws Exception { + PayAttendanceBo attendance = new PayAttendanceBo(); + attendance.setKaoqinjiNum(kaoqinType); + attendance.setKaoqinYearMonth(date); + List occupaAttendance= iPayAttendanceService.queryList(attendance); + if(occupaAttendance!=null&&occupaAttendance.size()>0){ + if(!updateSupport){ //判断是否为更新 + return R.fail("已有当月考勤信息,如需更新请勾选更新考勤"); + }else{ //选择是更新数据时根据年月和考勤机删除原来记录的当月数据 + List ids = new ArrayList<>(); + for(PayAttendanceVo attendance1:occupaAttendance){ + ids.add(attendance1.getId()) ; + } + iPayAttendanceService.deleteWithValidByIds(ids,true); + } + } + + List attendanceList; + //判断考勤机(综合办与网机用一个模板,围栏一个模板) + if(!kaoqinType.equals("2")){ + attendanceList = new AttendanceExcelUtil().importKaoQinExcel(StringUtils.EMPTY,file.getInputStream(),3,date,kaoqinType,tenantId); + }else{ + attendanceList = new AttendanceExcelUtil().importKaoQinExcel2(StringUtils.EMPTY,file.getInputStream(),2,date,kaoqinType,tenantId); + } + String message = iPayAttendanceService.importAttendance(attendanceList, updateSupport, date); + return R.ok(message); + } /** * 获取考勤详细信息 @@ -79,7 +113,15 @@ public class PayAttendanceController extends BaseController { @RepeatSubmit() @PostMapping() public R add(@Validated(AddGroup.class) @RequestBody PayAttendanceBo bo) { - return toAjax(iPayAttendanceService.insertByBo(bo)); + // 验证本人当日的考勤是否存在 + PayAttendanceBo query = new PayAttendanceBo(); + query.setEmpName(bo.getEmpName()); + query.setKaoqinDate(bo.getKaoqinDate()); + List attendances=iPayAttendanceService.queryList(query); + if (attendances==null||attendances.size()==0){ + return toAjax(iPayAttendanceService.insertByBo(bo)); + } + return R.fail("已存在"+bo.getEmpName()+"的考勤"); } /** diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/PayAttendance.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/PayAttendance.java index df5538e..721f5de 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/PayAttendance.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/PayAttendance.java @@ -52,22 +52,27 @@ public class PayAttendance extends BaseEntity { /** * 上午开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date amStartTime; /** * 上午结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date amEndTime; /** * 下午开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date pmStartTime; /** * 下午结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date pmEndTime; /** * 考勤日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") private Date kaoqinDate; /** * 考勤年份月份 (yyyy-MM) diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/bo/PayAttendanceBo.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/bo/PayAttendanceBo.java index c61ec19..cfa2c64 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/bo/PayAttendanceBo.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/bo/PayAttendanceBo.java @@ -62,30 +62,35 @@ public class PayAttendanceBo extends BaseEntity { /** * 上午开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @NotNull(message = "上午开始时间不能为空", groups = { AddGroup.class, EditGroup.class }) private Date amStartTime; /** * 上午结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @NotNull(message = "上午结束时间不能为空", groups = { AddGroup.class, EditGroup.class }) private Date amEndTime; /** * 下午开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @NotNull(message = "下午开始时间不能为空", groups = { AddGroup.class, EditGroup.class }) private Date pmStartTime; /** * 下午结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @NotNull(message = "下午结束时间不能为空", groups = { AddGroup.class, EditGroup.class }) private Date pmEndTime; /** * 考勤日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") @NotNull(message = "考勤日期不能为空", groups = { AddGroup.class, EditGroup.class }) private Date kaoqinDate; diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/vo/PayAttendanceVo.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/vo/PayAttendanceVo.java index a9ef272..20e8493 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/vo/PayAttendanceVo.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/vo/PayAttendanceVo.java @@ -62,30 +62,35 @@ public class PayAttendanceVo { /** * 上午开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "上午开始时间") private Date amStartTime; /** * 上午结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "上午结束时间") private Date amEndTime; /** * 下午开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "下午开始时间") private Date pmStartTime; /** * 下午结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty(value = "下午结束时间") private Date pmEndTime; /** * 考勤日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") @ExcelProperty(value = "考勤日期") private Date kaoqinDate; diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayAttendanceMapper.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayAttendanceMapper.java index 0fd6257..4026733 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayAttendanceMapper.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayAttendanceMapper.java @@ -3,6 +3,7 @@ package com.ruoyi.pay.mapper; import com.ruoyi.pay.domain.PayAttendance; import com.ruoyi.pay.domain.vo.PayAttendanceVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; +import org.apache.ibatis.annotations.Select; /** * 考勤Mapper接口 @@ -11,5 +12,7 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus; * @date 2025-05-12 */ public interface PayAttendanceMapper extends BaseMapperPlus { - + @Select({" select e.id employeeId,d.dept_id deptId,d.dept_name deptName from pay_employee_info e join sys_dept d on e.dept_id=d.dept_id " + + " where e.name=#{name} and e.deleted=0"} ) + PayAttendance selectEmpInfoByName(String empName); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayAttendanceService.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayAttendanceService.java index c592815..5a29841 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayAttendanceService.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayAttendanceService.java @@ -46,4 +46,8 @@ public interface IPayAttendanceService { * 校验并批量删除考勤信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + PayAttendance selectEmpInfoByName(String empName); + + String importAttendance(List attendanceList, boolean updateSupport, String date); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayAttendanceServiceImpl.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayAttendanceServiceImpl.java index dc129f3..4057e0d 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayAttendanceServiceImpl.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayAttendanceServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.pay.service.impl; import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.PageQuery; @@ -15,6 +16,7 @@ import com.ruoyi.pay.domain.PayAttendance; import com.ruoyi.pay.mapper.PayAttendanceMapper; import com.ruoyi.pay.service.IPayAttendanceService; +import java.text.SimpleDateFormat; import java.util.List; import java.util.Map; import java.util.Collection; @@ -117,4 +119,90 @@ public class PayAttendanceServiceImpl implements IPayAttendanceService { } return baseMapper.deleteBatchIds(ids) > 0; } + + @Override + public PayAttendance selectEmpInfoByName(String empName) { + return baseMapper.selectEmpInfoByName(empName); + } + + @Override + public String importAttendance(List attendanceList, boolean updateSupport, String date) { + if (null==attendanceList || attendanceList.size() == 0) + { + throw new ServiceException("导入考勤数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + for (PayAttendanceBo attendance : attendanceList) + { + try + { + // 验证本人当日的考勤是否存在(注意:在controller中更新数据时 以根据年月和考勤机删除原来记录数据) + PayAttendanceBo query = new PayAttendanceBo(); + query.setKaoqinDate(attendance.getKaoqinDate()); + query.setEmpName(attendance.getEmpName()); + List attendances=this.queryList(query); + if (null==attendances||attendances.size()==0) + { + this.insertByBo(attendance); + successNum++; + if(!updateSupport) { + successMsg.append("
" + successNum +": "+attendance.getEmpName()+new SimpleDateFormat("yyyy-MM-dd").format(attendance.getKaoqinDate())+ "考勤导入成功"); + }else{ + successMsg.append("
" + successNum +": "+attendance.getEmpName()+new SimpleDateFormat("yyyy-MM-dd").format(attendance.getKaoqinDate())+"考勤更新成功"); + } + } else { //员工在多个考勤机录入考勤 时进入 (注意:要求员工上午或下午打卡必须在同一个考勤机) + if(updateSupport){ + if(attendance.getAmStartTime()==null&&attendance.getAmEndTime()==null){ + attendance.setAmStartTime(attendances.get(0).getAmStartTime()); + attendance.setAmEndTime(attendances.get(0).getAmEndTime()); + } + if(attendance.getPmStartTime()==null&&attendance.getPmEndTime()==null){ + attendance.setPmStartTime(attendances.get(0).getPmStartTime()); + attendance.setPmEndTime(attendances.get(0).getPmEndTime()); + } + this.updateByBo(attendance); + successNum++; + successMsg.append("
" + successNum +": "+attendance.getEmpName()+new SimpleDateFormat("yyyy-MM-dd").format(attendance.getKaoqinDate())+ "考勤更新成功"); + }else{ + String kaoqinji=""; + switch (attendances.get(0).getKaoqinjiNum()){ + case "0": + kaoqinji ="综合办"; + break; + case "1": + kaoqinji ="网机"; + break; + case "2": + kaoqinji ="围栏"; + break; + case "3": + kaoqinji ="手动添加"; + break; + } + failureNum++; + failureMsg.append("
" + failureNum +": "+attendance.getEmpName()+new SimpleDateFormat("yyyy-MM-dd").format(attendance.getKaoqinDate())+" "+kaoqinji+"考勤机已存在"); + + } + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum+ ": "+attendance.getEmpName() +" "+attendance.getEmpName()+new SimpleDateFormat("yyyy-MM-dd").format(attendance.getKaoqinDate()) + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + System.err.println(msg+e); + } + } + if (failureNum > 0) + { + failureMsg.insert(0, "导入成功"+successNum+"条,导入失败" + failureNum + " 条,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } + else + { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/util/AttendanceExcelUtil.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/util/AttendanceExcelUtil.java new file mode 100644 index 0000000..4b8b3b7 --- /dev/null +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/util/AttendanceExcelUtil.java @@ -0,0 +1,531 @@ +package com.ruoyi.pay.util; + +import cn.hutool.core.lang.Dict; +import com.ruoyi.common.core.service.DictService; +import com.ruoyi.common.helper.LoginHelper; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.pay.domain.PayAttendance; +import com.ruoyi.pay.domain.bo.PayAttendanceBo; +import com.ruoyi.pay.service.IPayAttendanceService; +import org.springframework.stereotype.Component; + +import cn.hutool.core.date.DateTime; + +import org.apache.poi.ss.usermodel.Row; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; + +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.annotation.PostConstruct; +import java.io.IOException; +import java.io.InputStream; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +@Component +public class AttendanceExcelUtil { + + private final IPayAttendanceService iPayAttendanceService; + private final DictService dictService; + + public AttendanceExcelUtil() { + this.iPayAttendanceService = SpringUtils.getBean(IPayAttendanceService.class); + this.dictService = SpringUtils.getBean(DictService.class); + } + + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + + public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; + + public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; + + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + + /** + * 工作表名称 + */ + private String sheetName; + + /** + * 导出类型(EXPORT:导出数据;IMPORT:导入模板) + */ + //private Excel.Type type; + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 样式列表 + */ + private Map styles; + + /** + * 导入导出数据列表 + */ + private List list; + + /** + * 注解列表 + */ + private List fields; + + /** + * 当前行号 + */ + private int rownum; + + /** + * 标题 + */ + private String title; + + /** + * 最大高度 + */ + private short maxHeight; + + /** + * 统计列表 + */ + private Map statistics = new HashMap(); + + /** + * 数字格式 + */ + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); + + /** + * 实体对象 + */ + public Class clazz; + + /** + * 对excel表单指定表格索引名转换成list + * + * @param sheetName 表格索引名 + * @param titleNum 标题占用行数 + * @param is 输入流 + * @return 转换后集合 + */ + public List importKaoQinExcel(String sheetName, InputStream is, int titleNum, String date,String kaoqinType,Long tenantId) throws Exception { + List attendances = new ArrayList<>(); + //this.type = Excel.Type.IMPORT; + this.wb = WorkbookFactory.create(is); + + // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet + Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(2); + if (sheet == null) { + throw new IOException("文件sheet不存在"); + } + /* boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); + Map pictures; + if (isXSSFWorkbook) { + pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); + } else { + pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); + }*/ + + // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 + int rows = sheet.getLastRowNum(); + //把日期存放到list中 + List days = new ArrayList<>(); + if (rows > 0) { + // 定义一个map用于存放excel列的序号和field. + Map cellMap = new HashMap(); + // 获取表头 + /* Row heard = sheet.getRow(titleNum); + String[] yearAndMonth =date.split("-"); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) { + Cell cell = heard.getCell(i); + if (StringUtils.isNotNull(cell)) { + String value = this.getCellValue(heard, i).toString(); + if(value!=null&&!value.trim().equals("")){ + if(i<9){ + value=0+value; + } + days.add(value); + } + } + }*/ + int dayNumOfMonth = getDaysOfMonth(date); + for (Integer i = 1; i <= dayNumOfMonth; i++) { + if(i<=9){ + days.add("0"+i); + }else { + days.add(i.toString()); + } + } + //每2行是一条员工数据,除第titlenum行外,一次循环2行 + for (int i = titleNum + 1; i <= rows; i += 2) { + // 从第2行开始取数据,默认第一行是表头. + Row row1 = sheet.getRow(i); + Row row2 = sheet.getRow(i + 1); + // 判断当前行是否是空行 + if (isRowEmpty(row1)) { + continue; + } + String wid = this.getCellValue(row1, 2).toString();//考勤机工号 + String wname = this.getCellValue(row1, 10).toString(); + //根据员工name查询员工id、部门id、部门名称 + PayAttendance info = iPayAttendanceService.selectEmpInfoByName(wname); + if(info==null){ + throw new IOException("请先在员工表中添加员工:"+wname+" 或者考勤机选择错误"); + } + for (int j = 0; j < row2.getPhysicalNumberOfCells(); j++) { + if((j+1)>days.size()){ + break; + } + PayAttendanceBo attendance = new PayAttendanceBo(); + //attendance.setTenantId(LoginHelper.getTenantId()); + attendance.setTenantId(tenantId); + attendance.setKaoqinYearMonth(date); + attendance.setEmpName(wname); + attendance.setKaoqinjiNum(kaoqinType); + attendance.setEmployeeId(info.getEmployeeId()); + attendance.setDeptId(info.getDeptId()); + attendance.setDeptName(info.getDeptName()); + //得到年月日 + + String strday = date+"-"+days.get(j); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date day = sdf.parse(strday); + attendance.setKaoqinDate(day); + + Cell cell = row2.getCell(j); + if (!(null==cell)) { + String value = this.getCellValue(row2, j).toString(); + // System.out.println("*************************************:" + value); + if (value != null && !value.trim().equals("")) { //判断非空或者非空串单元格 + String[] times = value.split("\n"); + /* Date standard = new DateTime(strday + " 13:00:00");//以13点为分界线,改为去字典配置分界时间,去字典中去值*/ + Date standard = new DateTime(strday + " " +dictService.getDictValue("time_divid","noon_time"));//以字典值为分界线 + List ams = new ArrayList<>();//上午时间段内 + List pms = new ArrayList<>();//下午时间短内 + SimpleDateFormat punchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + for (String t : times) { + Date time = punchTime.parse(strday + " " + t + ":00"); + if (time.before(standard)) { + ams.add(time); + } else { + pms.add(time); + } + } + //判断上下午时间段有几个值,对应存储 + switch (ams.size()) { + case 0: + break; + case 1: + if(ams.get(0).before(punchTime.parse(strday+" 10:30:00"))){ //上午只打了一次卡 过了上午10点半算下班卡 + attendance.setAmStartTime(ams.get(0)); + }else{ + attendance.setAmEndTime(ams.get(0)); + } + break; + default: + List amtimes = getDates(ams); + attendance.setAmStartTime(amtimes.get(0)); + attendance.setAmEndTime(amtimes.get(1)); + break; + } + switch (pms.size()) { + case 0: + break; + case 1: + if(pms.get(0).before(punchTime.parse(strday+" 16:30:00"))){ //下午只打了一次卡 过了下午四点半算下班卡 + attendance.setPmStartTime(pms.get(0)); + }else{ + attendance.setPmEndTime(pms.get(0)); + } + break; + default: + List pmtimes = getDates(pms); + attendance.setPmStartTime(pmtimes.get(0)); + attendance.setPmEndTime(pmtimes.get(1)); + break; + } + } + } + attendances.add(attendance); + } + } + } + return attendances; + } + /** + * 获取单元格值 + * + * @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 (!(null==cell)) + { + if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) + { + val = cell.getNumericCellValue(); + if (DateUtil.isCellDateFormatted(cell)) + { + val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 + } + else + { + if ((Double) val % 1 != 0) + { + val = new BigDecimal(val.toString()); + } + else + { + val = new DecimalFormat("0").format(val); + } + } + } + else if (cell.getCellType() == CellType.STRING) + { + val = cell.getStringCellValue(); + } + else if (cell.getCellType() == CellType.BOOLEAN) + { + val = cell.getBooleanCellValue(); + } + else if (cell.getCellType() == CellType.ERROR) + { + val = cell.getErrorCellValue(); + } + + } + } + catch (Exception e) + { + return val; + } + return val; + } + + /** + * 判断是否是空行 + * + * @param row 判断的行 + * @return + */ + private boolean isRowEmpty(Row row) + { + if (row == null) + { + return true; + } + for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) + { + Cell cell = row.getCell(i); + if (cell != null && cell.getCellType() != CellType.BLANK) + { + return false; + } + } + return true; + } + /** + * 返回日期中的最大值 最小值 + */ + private List getDates(List dates){ + List times = new ArrayList<>(); + Date max = dates.get(0); + Date min = dates.get(0); + for(Date time:dates){ + if(time.before(max)){ + min = time; + }else{ + max = time; + } + } + times.add(min); + times.add(max); + return times; + } + + public List importKaoQinExcel2(String empty, InputStream inputStream, int titleNum, String date,String kaoqinType,Long tenantId) throws Exception{ + List attendances = new ArrayList<>(); + // this.type = Excel.Type.IMPORT; + this.wb = WorkbookFactory.create(inputStream); + + // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第3个sheet + Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(2); + if (sheet == null) { + throw new IOException("文件sheet不存在"); + } + boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); + /*Map pictures; + if (isXSSFWorkbook) { + pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); + } else { + pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); + }*/ + // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 + int rows = sheet.getLastRowNum(); + //把日期存放到list中 + List days = new ArrayList<>(); + if (rows > 0) { + // 定义一个map用于存放excel列的序号和field. + Map cellMap = new HashMap(); + // 获取表头 + /*Row heard = sheet.getRow(titleNum); + + for (int i = 3; i < heard.getPhysicalNumberOfCells(); i++) { + Cell cell = heard.getCell(i); + if (StringUtils.isNotNull(cell)) { + String value = this.getCellValue(heard, i).toString(); + if(value!=null&&!value.trim().equals("")){ + if(i<9){ + value=0+value; + } + days.add(value); + } + } + }*/ + int dayNumOfMonth = getDaysOfMonth(date); + for (Integer i = 1; i <= dayNumOfMonth; i++) { + if(i<=9){ + days.add("0"+i); + }else { + days.add(i.toString()); + } + } + + + //每1行是一条员工数据,除第titlenum+2行外,一次循环1行 + for (int i = titleNum + 2; i <= rows; i++) { + // 从第2行开始取数据,默认第一行是表头. + Row row1 = sheet.getRow(i); + // 判断当前行是否是空行 + if (isRowEmpty(row1)) { + continue; + } + String wid = this.getCellValue(row1, 0).toString();//考勤机工号 + String wname = this.getCellValue(row1, 1).toString();//姓名 + //根据员工name查询员工id、部门id、部门名称 + PayAttendance info = iPayAttendanceService.selectEmpInfoByName(wname); + if(info==null){ + throw new IOException("请先在员工表中添加员工:"+wname+" 或者考勤机选择错误"); + } + for (int j = 3; j < row1.getPhysicalNumberOfCells(); j++) { + if((j-2)>days.size()){ + break; + } + PayAttendanceBo attendance = new PayAttendanceBo(); + //attendance.setTenantId(LoginHelper.getTenantId()); + attendance.setTenantId(tenantId); + attendance.setKaoqinYearMonth(date); + attendance.setEmpName(wname); + attendance.setKaoqinjiNum(kaoqinType); + + attendance.setEmployeeId(info.getEmployeeId()); + attendance.setDeptId(info.getDeptId()); + attendance.setDeptName(info.getDeptName()); + + String strday = date+"-"+days.get(j-3); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date day = sdf.parse(strday); + attendance.setKaoqinDate(day); + + Cell cell = row1.getCell(j); + if (!(null==cell)){ + String value = this.getCellValue(row1, j).toString(); + // System.out.println("*************************************:"+value); + if(value!=null&&!value.trim().equals("")) {//判断非空或者非空串单元格 + String[] times = value.split("\n"); + /* Date standard = new DateTime(strday + " 13:00:00");//以13点为分界线,改为去字典配置分界时间,去字典中去值*/ + Date standard = new DateTime(strday + " " + dictService.getDictValue("pay_time_divid","noon_time"));//以13点为分界线 + List ams = new ArrayList<>();//上午时间段内 + List pms = new ArrayList<>();//下午时间短内 + SimpleDateFormat punchTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + for(String t:times){ + Date time= punchTime.parse(strday+" "+t+":00"); + if(time.before(standard)){ + ams.add(time); + }else{ + pms.add(time); + } + } + //判断上下午时间段有几个值,对应存储 + switch (ams.size()){ + case 0: + break; + case 1: + if(ams.get(0).before(punchTime.parse(strday+" 10:30:00"))){ //上午只打了一次卡 过了上午10点半算下班卡 + attendance.setAmStartTime(ams.get(0)); + }else{ + attendance.setAmEndTime(ams.get(0)); + } + break; + default: + List amtimes = getDates(ams); + attendance.setAmStartTime(amtimes.get(0)); + attendance.setAmEndTime(amtimes.get(1)); + break; + } + switch (pms.size()){ + case 0: + break; + case 1: + if(pms.get(0).before(punchTime.parse(strday+" 16:30:00"))){ //下午只打了一次卡 过了下午四点半算下班卡 + attendance.setPmStartTime(pms.get(0)); + }else{ + attendance.setPmEndTime(pms.get(0)); + } + break; + default: + List pmtimes = getDates(pms); + attendance.setPmStartTime(pmtimes.get(0)); + attendance.setPmEndTime(pmtimes.get(1)); + break; + } + + } + } + attendances.add(attendance); + } + } + } + return attendances; + } + //获取一个月天数 + public static int getDaysOfMonth(String datestr) throws ParseException { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM"); + Date date = format.parse(datestr); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + } + + + +} + From c6a0a1ba3a7da6a7969ced45eef779daece98150 Mon Sep 17 00:00:00 2001 From: hshansha Date: Wed, 21 May 2025 11:49:09 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=BA=94=E5=87=BA=E5=8B=A4=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PayRequireAttendanceReportController.java | 34 ++++++++ .../IPayRequireAttendanceReportService.java | 2 + ...PayRequireAttendanceReportServiceImpl.java | 87 ++++++++++++++++++- 3 files changed, 122 insertions(+), 1 deletion(-) diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayRequireAttendanceReportController.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayRequireAttendanceReportController.java index d05e3ec..bb744d3 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayRequireAttendanceReportController.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayRequireAttendanceReportController.java @@ -1,9 +1,11 @@ package com.ruoyi.pay.controller; +import java.util.ArrayList; import java.util.List; import java.util.Arrays; import java.util.concurrent.TimeUnit; +import com.ruoyi.pay.domain.PayRequireAttendanceReport; import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.*; @@ -24,6 +26,7 @@ import com.ruoyi.pay.domain.vo.PayRequireAttendanceReportVo; import com.ruoyi.pay.domain.bo.PayRequireAttendanceReportBo; import com.ruoyi.pay.service.IPayRequireAttendanceReportService; import com.ruoyi.common.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; /** * 应出勤报 @@ -59,6 +62,37 @@ public class PayRequireAttendanceReportController extends BaseController { ExcelUtil.exportExcel(list, "应出勤报", PayRequireAttendanceReportVo.class, response); } + /** + * 导出应出勤报列表 + */ + @SaCheckPermission("pay:requireAttendanceReport:import") + @Log(title = "应出勤报", businessType = BusinessType.EXPORT) + @PostMapping("/import") + public R importData(MultipartFile file, boolean updateSupport, String date,Long tenantId) throws Exception { + PayRequireAttendanceReportBo report = new PayRequireAttendanceReportBo(); + report.setYear(date.split("-")[0]); + report.setMonth(date.split("-")[1]); + List occupaReports= iPayRequireAttendanceReportService.queryList(report); + if(occupaReports!=null&&occupaReports.size()>0){//判断是否有当月应出勤信息 + if(!updateSupport){ + return R.ok("已有当月应出勤信息,如需更新请勾选更新选项"); + }else{//更新则删除之前信息 + List ids = new ArrayList<>(); + for(PayRequireAttendanceReportVo re:occupaReports){ + ids.add(re.getId()) ; + } + iPayRequireAttendanceReportService.deleteWithValidByIds(ids,true); + } + } + + List requireAttendanceReports = ExcelUtil.importExcel(file.getInputStream(), PayRequireAttendanceReportVo.class); + String message = iPayRequireAttendanceReportService.importAttendanceReport(requireAttendanceReports, updateSupport, date,tenantId); + return R.ok(message); + + } + + + /** * 获取应出勤报详细信息 * diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayRequireAttendanceReportService.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayRequireAttendanceReportService.java index 709a2c1..a775ca2 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayRequireAttendanceReportService.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayRequireAttendanceReportService.java @@ -46,4 +46,6 @@ public interface IPayRequireAttendanceReportService { * 校验并批量删除应出勤报信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + String importAttendanceReport(List requireAttendanceReports, boolean updateSupport, String date,Long tenantId); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayRequireAttendanceReportServiceImpl.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayRequireAttendanceReportServiceImpl.java index 27dca1e..f887dab 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayRequireAttendanceReportServiceImpl.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayRequireAttendanceReportServiceImpl.java @@ -1,12 +1,15 @@ package com.ruoyi.pay.service.impl; import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.pay.domain.PayAttendance; +import com.ruoyi.pay.mapper.PayAttendanceMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.ruoyi.pay.domain.bo.PayRequireAttendanceReportBo; @@ -15,6 +18,8 @@ import com.ruoyi.pay.domain.PayRequireAttendanceReport; import com.ruoyi.pay.mapper.PayRequireAttendanceReportMapper; import com.ruoyi.pay.service.IPayRequireAttendanceReportService; +import java.io.IOException; +import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.Collection; @@ -30,7 +35,7 @@ import java.util.Collection; public class PayRequireAttendanceReportServiceImpl implements IPayRequireAttendanceReportService { private final PayRequireAttendanceReportMapper baseMapper; - + private final PayAttendanceMapper attendanceMapper; /** * 查询应出勤报 */ @@ -119,4 +124,84 @@ public class PayRequireAttendanceReportServiceImpl implements IPayRequireAttenda } return baseMapper.deleteBatchIds(ids) > 0; } + + @Override + public String importAttendanceReport(List attendanceReportList, boolean updateSupport, String date,Long tenantId) { + if (null==attendanceReportList || attendanceReportList.size() == 0) + { + throw new ServiceException("导入数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + + for (PayRequireAttendanceReportVo attendanceReport : attendanceReportList) + { //如果导入数据没有姓名则进行下一条 + if(attendanceReport.getEmpName()==null||attendanceReport.getEmpName().trim().equals("")){ + continue; + } + //应出勤天数,实际出勤天数,出勤小时数,加班小时数为null 则赋值0 + if(attendanceReport.getRequireDays()==null){ + attendanceReport.setRequireDays(Long.parseLong("0")); + } + if(attendanceReport.getAvtiveDays()==null){ + attendanceReport.setAvtiveDays(Long.parseLong("0")); + } + if(attendanceReport.getAttendanceHours()==null){ + attendanceReport.setAttendanceHours(new BigDecimal("0")); + } + if(attendanceReport.getOvertimeHours()==null){ + attendanceReport.setOvertimeHours(new BigDecimal("0")); + } + try + { + attendanceReport.setYear(date.split("-")[0]); + attendanceReport.setMonth(date.split("-")[1]); + String name = attendanceReport.getEmpName(); + //根据员工name查询员工id、部门id、部门名称 + + PayAttendance info = attendanceMapper.selectEmpInfoByName(name); + if(info==null){ + throw new IOException("请先在员工表中添加员工:"+name); + } + attendanceReport.setEmployeeId(info.getEmployeeId()); + attendanceReport.setDeptName(info.getDeptName()); + attendanceReport.setTenantId(tenantId); + // 验证是否存在这个人的报告 + PayRequireAttendanceReportBo bo = BeanUtil.toBean(attendanceReport,PayRequireAttendanceReportBo.class); + List r = this.queryList(bo); + if (null==r||r.size()==0) + { + this.insertByBo(bo); + successNum++; + if(updateSupport){ + successMsg.append("
" + successNum + attendanceReport.getEmpName()+ " 更新成功"); + }else{ + successMsg.append("
" + successNum + attendanceReport.getEmpName()+ "导入成功"); + } + } else { + failureNum++; + failureMsg.append("
" + failureNum + attendanceReport.getEmpName() + " 已存在"); + } + } + catch (Exception e) + { + failureNum++; + String msg = "
" + failureNum + attendanceReport.getEmpName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + System.err.println(msg+ e); + } + } + if (failureNum > 0) + { + failureMsg.insert(0, "导入成功"+successNum+"条,导入失败" + failureNum + " 条,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } + else + { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } } From 896b60fbfd51e18cc9a1d3dbd545055b6600e310 Mon Sep 17 00:00:00 2001 From: hshansha Date: Thu, 22 May 2025 16:33:50 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=91=98=E5=B7=A5=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E9=83=A8=E9=97=A8=E5=90=8D=E7=A7=B0=E3=80=81=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E9=9D=9E=E7=A9=BA=E9=AA=8C=E8=AF=81=EF=BC=8C?= =?UTF-8?q?=E5=91=98=E5=B7=A5=E8=A1=A5=E8=B4=B4=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/mapper/BaseMapperPlus.java | 10 +++ .../controller/PayButieEmplyeeController.java | 87 +++++++++++++++++- .../com/ruoyi/pay/domain/PayEmployeeInfo.java | 4 + .../pay/domain/bo/PayEmployeeInfoBo.java | 44 +++++---- .../ruoyi/pay/domain/vo/ButieSummaryVo.java | 70 +++++++++++++++ .../pay/domain/vo/PayEmployeeInfoVo.java | 6 ++ .../pay/service/IPayButieEmplyeeService.java | 5 ++ .../impl/PayButieEmplyeeServiceImpl.java | 90 +++++++++++++++++++ .../impl/PayEmployeeInfoServiceImpl.java | 1 + .../mapper/pay/PayEmployeeInfoMapper.xml | 1 + 10 files changed, 297 insertions(+), 21 deletions(-) create mode 100644 ruoyi-pay/src/main/java/com/ruoyi/pay/domain/vo/ButieSummaryVo.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java index 251e04d..92257ca 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.toolkit.Db; import com.ruoyi.common.utils.BeanCopyUtils; +import org.apache.ibatis.annotations.Select; import org.apache.ibatis.logging.Log; import org.apache.ibatis.logging.LogFactory; @@ -188,5 +189,14 @@ public interface BaseMapperPlus extends BaseMapper { voPage.setRecords(BeanCopyUtils.copyList(pageData.getRecords(), voClass)); return (P) voPage; } + /** + * 说明:根据年月删除所有的关联表数据 + * + * @return 成功标志 + */ + @Select("DELETE FROM pay_butie_emplyee WHERE date = #{thisMonth}") + void deleteSgrButieEmplyeeByDate(String month); + @Select("SELECT COUNT(*) FROM pay_butie_emplyee WHERE date = #{month}") + Integer getLatestDate(String month); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayButieEmplyeeController.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayButieEmplyeeController.java index 82d4edc..e6d72a0 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayButieEmplyeeController.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayButieEmplyeeController.java @@ -1,9 +1,21 @@ package com.ruoyi.pay.controller; -import java.util.List; -import java.util.Arrays; +import java.math.BigDecimal; +import java.util.*; import java.util.concurrent.TimeUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import com.ruoyi.pay.domain.PayButie; +import com.ruoyi.pay.domain.PayEmployeeInfo; +import com.ruoyi.pay.domain.bo.PayButieBo; +import com.ruoyi.pay.domain.bo.PayEmployeeInfoBo; +import com.ruoyi.pay.domain.vo.ButieSummaryVo; +import com.ruoyi.pay.domain.vo.PayButieVo; +import com.ruoyi.pay.domain.vo.PayEmployeeInfoVo; +import com.ruoyi.pay.service.IPayButieService; +import com.ruoyi.pay.service.IPayEmployeeInfoService; import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.*; @@ -38,6 +50,8 @@ import com.ruoyi.common.core.page.TableDataInfo; public class PayButieEmplyeeController extends BaseController { private final IPayButieEmplyeeService iPayButieEmplyeeService; + private final IPayEmployeeInfoService employeeInfoService; + private final IPayButieService butieService; /** * 查询补贴和员工联系列表 @@ -105,4 +119,73 @@ public class PayButieEmplyeeController extends BaseController { @PathVariable Long[] ids) { return toAjax(iPayButieEmplyeeService.deleteWithValidByIds(Arrays.asList(ids), true)); } + + /** + * 说明:获取员工名称列表,用于工单选择工人 + * + * @return EmployeeInfoVo 列表 + */ + @SaCheckPermission("pay:butieEmplyee:gen") + @Log(title = "月度补贴生成", businessType = BusinessType.INSERT) + @PostMapping("/gen") + public R generateBuTieEmpByMonth(@RequestBody JSONObject object) { + return iPayButieEmplyeeService.generateBuTieEmpByMonth(object.get("month", String.class), object.get("cover", Boolean.class)); + } + + @PostMapping("/check") + public R checkDataExist(@RequestBody JSONObject object) { + return iPayButieEmplyeeService.checkDataExist(object.get("month", String.class)); + } + + + + + /** + * 查询员工补贴列表 + * + */ + @SaCheckPermission("pay:butieEmplyee:list") + @DeleteMapping("/summary") + public TableDataInfo summary(PayButieEmplyeeBo bo, PageQuery pageQuery) { + String date; + if (null==(bo.getDate())) { // 默认查询本月的数据 + date = DateUtil.format(new Date(), "yyyy-MM"); + } else { + date = bo.getDate(); + } + PayEmployeeInfoBo employeeInfo = new PayEmployeeInfoBo(); + employeeInfo.setId(bo.getEmployeeId()); + TableDataInfo payEmployeeTableDataInfo = employeeInfoService.queryPageList(employeeInfo, pageQuery); + List butieSummaryVos = this.buildEmployeeInfo(payEmployeeTableDataInfo.getRows(), date); + return TableDataInfo.build(butieSummaryVos); + } + + private List buildEmployeeInfo(List list, String date) { + List sgrButies = butieService.queryList(new PayButieBo()); + ArrayList summaryVos = new ArrayList<>(); + list.parallelStream().forEachOrdered(emp -> { + ButieSummaryVo butieSummaryVo = new ButieSummaryVo(); + butieSummaryVo.setEmpName(emp.getName()); + butieSummaryVo.setDate(date); + HashMap map = new HashMap<>(); + for (PayButieVo butie : sgrButies) { + PayButieEmplyeeBo query = new PayButieEmplyeeBo(); + query.setEmployeeId(emp.getId()); + query.setButieId(butie.getId()); + query.setDate(date); + List butieEmplyeeVos = iPayButieEmplyeeService.queryList(query); + BigDecimal money =butieEmplyeeVos.get(0).getMoney(); + HashMap inMap = new HashMap<>(); + inMap.put("btid", butie.getId()); + inMap.put("money",money); + map.put(butie.getName(), inMap); + } + butieSummaryVo.setButieMap(map); + butieSummaryVo.setEdit(false); + butieSummaryVo.setEmpId(emp.getId()); + summaryVos.add(butieSummaryVo); + }); + return summaryVos; + } + } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/PayEmployeeInfo.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/PayEmployeeInfo.java index 418d2aa..f966bef 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/PayEmployeeInfo.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/PayEmployeeInfo.java @@ -42,6 +42,10 @@ public class PayEmployeeInfo extends BaseEntity { * 员工所属部门 */ private Long deptId; + /** + * 部门名称 + */ + private String deptName; /** * 员工姓名 */ diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/bo/PayEmployeeInfoBo.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/bo/PayEmployeeInfoBo.java index 7fedc77..7a81dcc 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/bo/PayEmployeeInfoBo.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/bo/PayEmployeeInfoBo.java @@ -39,7 +39,7 @@ public class PayEmployeeInfoBo extends BaseEntity { /** * 登录用户id */ - @NotNull(message = "登录用户id不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotNull(message = "登录用户id不能为空", groups = { AddGroup.class, EditGroup.class }) private Long userId; /** @@ -48,6 +48,12 @@ public class PayEmployeeInfoBo extends BaseEntity { @NotNull(message = "员工所属部门不能为空", groups = { AddGroup.class, EditGroup.class }) private Long deptId; + /** + * 部门名称 + */ + @NotBlank(message = "部门名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String deptName; + /** * 员工姓名 */ @@ -57,13 +63,13 @@ public class PayEmployeeInfoBo extends BaseEntity { /** * 性别(0:男 1:女) */ - @NotBlank(message = "性别(0:男 1:女)不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotBlank(message = "性别(0:男 1:女)不能为空", groups = { AddGroup.class, EditGroup.class }) private String sex; /** * 年龄 */ - @NotNull(message = "年龄不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotNull(message = "年龄不能为空", groups = { AddGroup.class, EditGroup.class }) private Long age; /** @@ -75,19 +81,19 @@ public class PayEmployeeInfoBo extends BaseEntity { /** * 身份证号 */ - @NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotBlank(message = "身份证号不能为空", groups = { AddGroup.class, EditGroup.class }) private String idcard; /** * 银行卡号 */ - @NotBlank(message = "银行卡号不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotBlank(message = "银行卡号不能为空", groups = { AddGroup.class, EditGroup.class }) private String bankCardNumber; /** * 开户行 */ - @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotBlank(message = "开户行不能为空", groups = { AddGroup.class, EditGroup.class }) private String openingBank; /** @@ -99,19 +105,19 @@ public class PayEmployeeInfoBo extends BaseEntity { /** * 日薪 */ - @NotNull(message = "日薪不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotNull(message = "日薪不能为空", groups = { AddGroup.class, EditGroup.class }) private BigDecimal daySalary; /** * 时薪 */ - @NotNull(message = "时薪不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotNull(message = "时薪不能为空", groups = { AddGroup.class, EditGroup.class }) private BigDecimal hourSalary; /** * 休息类型(0 :周休 1:非周休 2:天休 3:小时 4:包月 5:周二天) */ - @NotBlank(message = "休息类型(0 :周休 1:非周休 2:天休 3:小时 4:包月 5:周二天)不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotBlank(message = "休息类型(0 :周休 1:非周休 2:天休 3:小时 4:包月 5:周二天)不能为空", groups = { AddGroup.class, EditGroup.class }) private String restType; /** @@ -135,61 +141,61 @@ public class PayEmployeeInfoBo extends BaseEntity { /** * 学历 */ - @NotBlank(message = "学历不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotBlank(message = "学历不能为空", groups = { AddGroup.class, EditGroup.class }) private String education; /** * 家庭住址 */ - @NotBlank(message = "家庭住址不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotBlank(message = "家庭住址不能为空", groups = { AddGroup.class, EditGroup.class }) private String address; /** * 紧急联系人 */ - @NotBlank(message = "紧急联系人不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotBlank(message = "紧急联系人不能为空", groups = { AddGroup.class, EditGroup.class }) private String contact; /** * 紧急联系人电话 */ - @NotBlank(message = "紧急联系人电话不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotBlank(message = "紧急联系人电话不能为空", groups = { AddGroup.class, EditGroup.class }) private String contactPhone; /** * 质检(1-是 0-否) */ - @NotNull(message = "质检(1-是 0-否)不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotNull(message = "质检(1-是 0-否)不能为空", groups = { AddGroup.class, EditGroup.class }) private Integer zhijian; /** * 业务员(1-是 0-否) */ - @NotNull(message = "业务员(1-是 0-否)不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotNull(message = "业务员(1-是 0-否)不能为空", groups = { AddGroup.class, EditGroup.class }) private Integer yewu; /** * 合同补助开始时间 */ - @NotNull(message = "合同补助开始时间不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotNull(message = "合同补助开始时间不能为空", groups = { AddGroup.class, EditGroup.class }) private Date htstime; /** * 合同补助结束时间 */ - @NotNull(message = "合同补助结束时间不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotNull(message = "合同补助结束时间不能为空", groups = { AddGroup.class, EditGroup.class }) private Date htetime; /** * 删除标志(1:删除 0:未删除) */ - @NotNull(message = "删除标志(1:删除 0:未删除)不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotNull(message = "删除标志(1:删除 0:未删除)不能为空", groups = { AddGroup.class, EditGroup.class }) private Integer deleted; /** * 备注 */ - @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) private String remark; diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/vo/ButieSummaryVo.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/vo/ButieSummaryVo.java new file mode 100644 index 0000000..0a610b0 --- /dev/null +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/vo/ButieSummaryVo.java @@ -0,0 +1,70 @@ +package com.ruoyi.pay.domain.vo; + +import java.util.Map; + +public class ButieSummaryVo { + /** 员工名称 */ + private String empName; + + /** 员工ID */ + private Long empId; + + /** 日期 */ + private String date; + + /** 补贴金额map */ + private Map butieMap; + + /** 是否可编辑 */ + private boolean edit; + + public Long getEmpId() { + return empId; + } + + public void setEmpId(Long empId) { + this.empId = empId; + } + + public boolean isEdit() { + return edit; + } + + public void setEdit(boolean edit) { + this.edit = edit; + } + + public String getEmpName() { + return empName; + } + + public void setEmpName(String empName) { + this.empName = empName; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public Map getButieMap() { + return butieMap; + } + + public void setButieMap(Map butieMap) { + this.butieMap = butieMap; + } + + @Override + public String toString() { + return "ButieSummaryVo{" + + "empName='" + empName + '\'' + + ", date='" + date + '\'' + + ", butieMap=" + butieMap + + ", edit=" + edit + + '}'; + } +} diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/vo/PayEmployeeInfoVo.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/vo/PayEmployeeInfoVo.java index 4139188..97e01af 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/vo/PayEmployeeInfoVo.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/domain/vo/PayEmployeeInfoVo.java @@ -48,6 +48,12 @@ public class PayEmployeeInfoVo { @ExcelProperty(value = "员工所属部门") private Long deptId; + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + /** * 员工姓名 */ diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayButieEmplyeeService.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayButieEmplyeeService.java index e08ac02..12766a7 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayButieEmplyeeService.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayButieEmplyeeService.java @@ -1,5 +1,6 @@ package com.ruoyi.pay.service; +import com.ruoyi.common.core.domain.R; import com.ruoyi.pay.domain.PayButieEmplyee; import com.ruoyi.pay.domain.vo.PayButieEmplyeeVo; import com.ruoyi.pay.domain.bo.PayButieEmplyeeBo; @@ -46,4 +47,8 @@ public interface IPayButieEmplyeeService { * 校验并批量删除补贴和员工联系信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + R generateBuTieEmpByMonth(String month, Boolean cover); + + R checkDataExist(String month); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayButieEmplyeeServiceImpl.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayButieEmplyeeServiceImpl.java index 13ad846..dda7373 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayButieEmplyeeServiceImpl.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayButieEmplyeeServiceImpl.java @@ -1,12 +1,21 @@ package com.ruoyi.pay.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.pay.domain.PayButie; +import com.ruoyi.pay.domain.PayEmployeeInfo; +import com.ruoyi.pay.domain.bo.PayButieBo; +import com.ruoyi.pay.domain.vo.PayButieVo; +import com.ruoyi.pay.domain.vo.PayEmployeeInfoVo; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.ruoyi.pay.domain.bo.PayButieEmplyeeBo; @@ -15,9 +24,11 @@ import com.ruoyi.pay.domain.PayButieEmplyee; import com.ruoyi.pay.mapper.PayButieEmplyeeMapper; import com.ruoyi.pay.service.IPayButieEmplyeeService; +import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.Collection; +import java.util.Optional; /** * 补贴和员工联系Service业务层处理 @@ -30,6 +41,8 @@ import java.util.Collection; public class PayButieEmplyeeServiceImpl implements IPayButieEmplyeeService { private final PayButieEmplyeeMapper baseMapper; + private final PayButieServiceImpl butieService; + private final PayEmployeeInfoServiceImpl employeeInfoService; /** * 查询补贴和员工联系 @@ -110,4 +123,81 @@ public class PayButieEmplyeeServiceImpl implements IPayButieEmplyeeService { } return baseMapper.deleteBatchIds(ids) > 0; } + + @Override + public R generateBuTieEmpByMonth(String month, Boolean cover) { + if (ObjectUtil.isNull(month)) { + throw new SecurityException("请完善月份信息"); + } + String lastMonth = DateUtil.format(DateUtil.offset(DateUtil.parse(month, "yyyy-MM"), DateField.MONTH, -1).toJdkDate(), "yyyy-MM"); + // 先删除本月数据 + baseMapper.deleteSgrButieEmplyeeByDate(month); + + List butieList = butieService.queryList(null); // 获取补贴列表 + List employeeInfoList = employeeInfoService.queryList(null);// 获取员工列表 + employeeInfoList.forEach(emp -> { + // 首先获取用户上个月份的补贴信息 + PayButieEmplyeeBo butieEmplyee = new PayButieEmplyeeBo(); + butieEmplyee.setDate(lastMonth); + butieEmplyee.setEmployeeId(emp.getId()); + List butieEmplyeeList = this.queryList(butieEmplyee); + if (ObjectUtil.isNotNull(butieEmplyeeList) && butieEmplyeeList.size() > 0) { // 具有某员工的上个月数据 + // 固定项继承, 非固定相为0 + for (PayButieVo butie : butieList) { + Optional first = butieEmplyeeList.stream().filter(btemp -> btemp.getButieId().equals(butie.getId())).findFirst(); + PayButieEmplyee payButieEmplyee = new PayButieEmplyee(); + // PayEmployeeInfo employeeInfo = employeeInfoService.selectSgrEmployeeInfoById(payButieEmplyee.getEmployeeId()); + if (first.isPresent()) { // 如果找到和补贴类型ID相同的项 + payButieEmplyee = BeanUtil.toBean(first.get(),PayButieEmplyee.class); + payButieEmplyee.setId(null); // ID 设置为null + payButieEmplyee.setDate(month); // 本月的年月 + payButieEmplyee.setCreateBy("system"); + payButieEmplyee.setCreateTime(null); + payButieEmplyee.setUpdateBy(null); + payButieEmplyee.setUpdateTime(null); + payButieEmplyee.setRemark(null); + if ("0".equals(butie.getFixed())) { //非固定项金额不继承 + payButieEmplyee.setMoney(BigDecimal.ZERO); + } + // 此处应该在上面是否非固定的判断中进行再判断 + //// 判断是否是合同补助项,如果合同补助项不在时间范围内,继承的金额也设置为0 + //if ("合同补助".equals(sgrButie.getName())) { + // Date date = new Date(); + // if (ObjectUtil.isNull(employeeInfo.getHtstime()) || date.before(employeeInfo.getHtstime()) || date.after(employeeInfo.getHtstime())) { + // sgrButieEmplyee.setMoney(BigDecimal.ZERO); + // } + //} + } else { // 未找到相同项 + payButieEmplyee.setButieId(butie.getId()); + payButieEmplyee.setEmployeeId(emp.getId()); + payButieEmplyee.setDate(month); + payButieEmplyee.setCreateBy("system"); + payButieEmplyee.setMoney(BigDecimal.ZERO); + } + baseMapper.insert(payButieEmplyee); + } + } else { // 没有某员工的上个月数据 + for (PayButieVo butie : butieList) { // 对应生成某员工所有补贴类型的数据项 + PayButieEmplyee PaybutieEmplyee = new PayButieEmplyee(); + PaybutieEmplyee.setButieId(butie.getId()); + PaybutieEmplyee.setEmployeeId(emp.getId()); + PaybutieEmplyee.setMoney(BigDecimal.ZERO); + PaybutieEmplyee.setDate(month); + PaybutieEmplyee.setCreateBy("system"); + baseMapper.insert(PaybutieEmplyee); + } + } + }); + return R.ok(month+"月份数据已生成"); + } + + @Override + public R checkDataExist(String month) { + Integer count = baseMapper.getLatestDate(month); + if (count > 0) { + return R.ok("数据已经存在,是否覆盖?"); + } else { + return this.generateBuTieEmpByMonth(month, true); + } + } } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayEmployeeInfoServiceImpl.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayEmployeeInfoServiceImpl.java index 60e71cc..23b97c9 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayEmployeeInfoServiceImpl.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayEmployeeInfoServiceImpl.java @@ -64,6 +64,7 @@ public class PayEmployeeInfoServiceImpl implements IPayEmployeeInfoService { lqw.eq(bo.getTenantId() != null, PayEmployeeInfo::getTenantId, bo.getTenantId()); lqw.eq(bo.getUserId() != null, PayEmployeeInfo::getUserId, bo.getUserId()); lqw.eq(bo.getDeptId() != null, PayEmployeeInfo::getDeptId, bo.getDeptId()); + lqw.like(StringUtils.isNotBlank(bo.getDeptName()), PayEmployeeInfo::getDeptName, bo.getDeptName()); lqw.like(StringUtils.isNotBlank(bo.getName()), PayEmployeeInfo::getName, bo.getName()); lqw.eq(StringUtils.isNotBlank(bo.getSex()), PayEmployeeInfo::getSex, bo.getSex()); lqw.eq(bo.getAge() != null, PayEmployeeInfo::getAge, bo.getAge()); diff --git a/ruoyi-pay/src/main/resources/mapper/pay/PayEmployeeInfoMapper.xml b/ruoyi-pay/src/main/resources/mapper/pay/PayEmployeeInfoMapper.xml index 2f959f4..24c3e4c 100644 --- a/ruoyi-pay/src/main/resources/mapper/pay/PayEmployeeInfoMapper.xml +++ b/ruoyi-pay/src/main/resources/mapper/pay/PayEmployeeInfoMapper.xml @@ -9,6 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + From d4506283a55838e96e76281accf23cdbced6a01e Mon Sep 17 00:00:00 2001 From: hshansha Date: Thu, 22 May 2025 16:44:11 +0800 Subject: [PATCH 4/5] =?UTF-8?q?bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/pay/PayEmployeeInfoMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-pay/src/main/resources/mapper/pay/PayEmployeeInfoMapper.xml b/ruoyi-pay/src/main/resources/mapper/pay/PayEmployeeInfoMapper.xml index 24c3e4c..b439fee 100644 --- a/ruoyi-pay/src/main/resources/mapper/pay/PayEmployeeInfoMapper.xml +++ b/ruoyi-pay/src/main/resources/mapper/pay/PayEmployeeInfoMapper.xml @@ -9,7 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + From 9d225da14f47a9da06a07636af2fede84e5860d4 Mon Sep 17 00:00:00 2001 From: hshansha Date: Fri, 23 May 2025 08:30:18 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=91=98=E5=B7=A5=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=AF=8F=E6=97=A5=E5=BA=94=E5=87=BA=E5=8B=A4?= =?UTF-8?q?=E5=B0=8F=E6=97=B6=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/controller/PayButieEmplyeeController.java | 3 --- .../pay/controller/PayEmployeeInfoController.java | 11 +++++++++++ .../com/ruoyi/pay/mapper/PayEmployeeInfoMapper.java | 4 +++- .../ruoyi/pay/service/IPayEmployeeInfoService.java | 2 ++ .../pay/service/impl/PayEmployeeInfoServiceImpl.java | 5 +++++ 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayButieEmplyeeController.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayButieEmplyeeController.java index e6d72a0..a61574d 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayButieEmplyeeController.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayButieEmplyeeController.java @@ -137,9 +137,6 @@ public class PayButieEmplyeeController extends BaseController { return iPayButieEmplyeeService.checkDataExist(object.get("month", String.class)); } - - - /** * 查询员工补贴列表 * diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayEmployeeInfoController.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayEmployeeInfoController.java index c02b449..4460ef4 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayEmployeeInfoController.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/controller/PayEmployeeInfoController.java @@ -106,6 +106,17 @@ public class PayEmployeeInfoController extends BaseController { return toAjax(iPayEmployeeInfoService.updateByBo(bo)); } + /** + * 批量修改员工每日应出勤小时数 + */ + @SaCheckPermission("pay:empinfo:edithour") + @Log(title = "员工信息", businessType = BusinessType.UPDATE) + @PutMapping("/edithour") + public R edit(@RequestParam("oldHour") String oldHour, @RequestParam("newHour") String newHour) + { + return toAjax(iPayEmployeeInfoService.updateSgrEmployeeHour(oldHour,newHour)); + } + /** * 删除员工信息 * diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayEmployeeInfoMapper.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayEmployeeInfoMapper.java index 54e68fd..0d31e1e 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayEmployeeInfoMapper.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/mapper/PayEmployeeInfoMapper.java @@ -3,6 +3,7 @@ package com.ruoyi.pay.mapper; import com.ruoyi.pay.domain.PayEmployeeInfo; import com.ruoyi.pay.domain.vo.PayEmployeeInfoVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; +import org.apache.ibatis.annotations.Update; /** * 员工信息Mapper接口 @@ -11,5 +12,6 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus; * @date 2025-05-12 */ public interface PayEmployeeInfoMapper extends BaseMapperPlus { - + @Update("update pay_employee_info e set e.hours_per_day = #{newHour} where e.hours_per_day = #{oldHour}") + int updateSgrEmployeeHour(String oldHour, String newHour); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayEmployeeInfoService.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayEmployeeInfoService.java index 2a17bbd..fc268c0 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayEmployeeInfoService.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/IPayEmployeeInfoService.java @@ -46,4 +46,6 @@ public interface IPayEmployeeInfoService { * 校验并批量删除员工信息信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + int updateSgrEmployeeHour(String oldHour, String newHour); } diff --git a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayEmployeeInfoServiceImpl.java b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayEmployeeInfoServiceImpl.java index 23b97c9..d89c22f 100644 --- a/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayEmployeeInfoServiceImpl.java +++ b/ruoyi-pay/src/main/java/com/ruoyi/pay/service/impl/PayEmployeeInfoServiceImpl.java @@ -131,4 +131,9 @@ public class PayEmployeeInfoServiceImpl implements IPayEmployeeInfoService { } return baseMapper.deleteBatchIds(ids) > 0; } + + @Override + public int updateSgrEmployeeHour(String oldHour, String newHour) { + return baseMapper.updateSgrEmployeeHour(oldHour,newHour); + } }