优化工资计算逻辑

This commit is contained in:
2025-03-13 15:32:52 +08:00
parent 222ebb07dc
commit bc2ce25f2a
10 changed files with 74 additions and 12 deletions

View File

@@ -24,6 +24,7 @@ import com.ruoyi.oa.domain.vo.OaSalaryVo;
import com.ruoyi.oa.domain.bo.OaSalaryBo; import com.ruoyi.oa.domain.bo.OaSalaryBo;
import com.ruoyi.oa.service.IOaSalaryService; import com.ruoyi.oa.service.IOaSalaryService;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/** /**
* 薪资管理 * 薪资管理
@@ -118,4 +119,6 @@ public class OaSalaryController extends BaseController {
public R<Void> calc(@RequestBody OaSalaryBo bo) { public R<Void> calc(@RequestBody OaSalaryBo bo) {
return R.ok(iOaSalaryService.calcSalary(bo)); return R.ok(iOaSalaryService.calcSalary(bo));
} }
} }

View File

@@ -4,6 +4,7 @@ import java.util.List;
import java.util.Arrays; import java.util.Arrays;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import com.ruoyi.oa.domain.bo.OaSalaryBo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*; import javax.validation.constraints.*;
@@ -47,6 +48,12 @@ public class OaSalaryItemController extends BaseController {
return iOaSalaryItemService.queryPageList(bo, pageQuery); return iOaSalaryItemService.queryPageList(bo, pageQuery);
} }
@GetMapping("/check-file")
public R<Boolean> checkFile(OaSalaryItemBo bo, PageQuery pageQuery) {
return R.ok(iOaSalaryItemService.checkFile(bo));
}
/** /**
* 导出薪水详情列表 * 导出薪水详情列表
*/ */
@@ -100,4 +107,6 @@ public class OaSalaryItemController extends BaseController {
@PathVariable Long[] salaryItemIds) { @PathVariable Long[] salaryItemIds) {
return toAjax(iOaSalaryItemService.deleteWithValidByIds(Arrays.asList(salaryItemIds), true)); return toAjax(iOaSalaryItemService.deleteWithValidByIds(Arrays.asList(salaryItemIds), true));
} }
} }

View File

@@ -27,13 +27,11 @@ public class OaSalaryItemBo extends BaseEntity {
/** /**
* 主键id * 主键id
*/ */
@NotNull(message = "主键id不能为空", groups = { EditGroup.class })
private Long salaryItemId; private Long salaryItemId;
/** /**
* 奖惩类型 * 奖惩类型
*/ */
@NotNull(message = "奖惩类型不能为空", groups = { AddGroup.class, EditGroup.class })
private Long type; private Long type;
/** /**
@@ -44,13 +42,11 @@ public class OaSalaryItemBo extends BaseEntity {
/** /**
* 涉及金额 * 涉及金额
*/ */
@NotNull(message = "涉及金额不能为空", groups = { AddGroup.class, EditGroup.class })
private Double price; private Double price;
/** /**
* 奖罚记号1奖0罚 * 奖罚记号1奖0罚
*/ */
@NotNull(message = "奖罚记号不能为空", groups = { AddGroup.class, EditGroup.class })
private Long flag; private Long flag;
/** /**

View File

@@ -70,4 +70,6 @@ public class OaSalaryVo extends OaSalary {
private String remark; private String remark;
private List<OaSalaryItemVo> itemList; private List<OaSalaryItemVo> itemList;
private Double laborCost;
} }

View File

@@ -27,4 +27,6 @@ public interface OaSalaryMapper extends BaseMapperPlus<OaSalaryMapper, OaSalary,
OaSalaryVo selectVoAndItemVoById(@Param("salaryId")Long salaryId,@Param("payTime")Date payTime); OaSalaryVo selectVoAndItemVoById(@Param("salaryId")Long salaryId,@Param("payTime")Date payTime);
void delByPayTime(Date date); void delByPayTime(Date date);
} }

View File

@@ -46,4 +46,7 @@ public interface IOaSalaryItemService {
* 校验并批量删除薪水详情信息 * 校验并批量删除薪水详情信息
*/ */
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
Boolean checkFile(OaSalaryItemBo bo);
} }

View File

@@ -111,4 +111,12 @@ public class OaSalaryItemServiceImpl implements IOaSalaryItemService {
} }
return baseMapper.deleteBatchIds(ids) > 0; return baseMapper.deleteBatchIds(ids) > 0;
} }
@Override
public Boolean checkFile(OaSalaryItemBo bo) {
LambdaQueryWrapper<OaSalaryItem> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(OaSalaryItem::getSignTime,bo.getSignTime());
lambdaQueryWrapper.eq(OaSalaryItem::getType,3L);
return baseMapper.selectList(lambdaQueryWrapper).isEmpty();
}
} }

View File

@@ -10,9 +10,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.oa.domain.OaSalaryItem; import com.ruoyi.oa.domain.OaSalaryItem;
import com.ruoyi.oa.domain.bo.SysOaAttendanceBo;
import com.ruoyi.oa.domain.vo.CalcResultVo; import com.ruoyi.oa.domain.vo.CalcResultVo;
import com.ruoyi.oa.domain.vo.SysOaAttendanceVo;
import com.ruoyi.oa.domain.vo.SysOaHolidayVo; import com.ruoyi.oa.domain.vo.SysOaHolidayVo;
import com.ruoyi.oa.mapper.OaSalaryItemMapper; import com.ruoyi.oa.mapper.OaSalaryItemMapper;
import com.ruoyi.oa.service.ISysOaAttendanceService;
import com.ruoyi.oa.service.ISysOaHolidayService; import com.ruoyi.oa.service.ISysOaHolidayService;
import com.ruoyi.oa.utils.OwnHttpUtils; import com.ruoyi.oa.utils.OwnHttpUtils;
import com.ruoyi.system.mapper.SysUserRoleMapper; import com.ruoyi.system.mapper.SysUserRoleMapper;
@@ -36,7 +39,6 @@ import com.ruoyi.oa.mapper.OaSalaryMapper;
import com.ruoyi.oa.service.IOaSalaryService; import com.ruoyi.oa.service.IOaSalaryService;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.*; import java.time.*;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
@@ -81,6 +83,9 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
@Autowired @Autowired
private SysUserRoleMapper sysUserRoleMapper; private SysUserRoleMapper sysUserRoleMapper;
@Autowired
private ISysOaAttendanceService sysOaAttendanceService;
/** /**
* 查询薪资管理 * 查询薪资管理
*/ */
@@ -94,11 +99,17 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
*/ */
@Override @Override
public TableDataInfo<OaSalaryVo> queryPageList(OaSalaryBo bo, PageQuery pageQuery) { public TableDataInfo<OaSalaryVo> queryPageList(OaSalaryBo bo, PageQuery pageQuery) {
List<Long> userIds = sysUserRoleMapper.selectUserIdsByNotRoleId(1852970465740505090L); List<Long> userIds = sysUserRoleMapper.selectUserIdsByNotRoleId(1852970465740505090L);
QueryWrapper<OaSalary> lqw = new QueryWrapper<>(); QueryWrapper<OaSalary> lqw = new QueryWrapper<>();
lqw.in("os.user_id",userIds); lqw.in("os.user_id",userIds);
Page<OaSalaryVo> result = baseMapper.selectStaffVoPage(pageQuery.build(), lqw,bo.getPayTime()); // 判断一下是否传参 如果没传参则默认查询当月记录,如果当月记录为空则创造当月的记录然后返回回去
Date payTime = bo.getPayTime()!=null?bo.getPayTime():new Date();
Page<OaSalaryVo> result = baseMapper.selectStaffVoPage(pageQuery.build(), lqw,payTime);
if (result.getRecords().isEmpty()){
// 判断是否有当前月的记录 没有则进行创造新的记录
this.importSalaryUser();
result = baseMapper.selectStaffVoPage(pageQuery.build(), lqw,payTime);
}
return TableDataInfo.build(result); return TableDataInfo.build(result);
} }
@@ -108,7 +119,13 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
List<Long> userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L); List<Long> userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L);
QueryWrapper<OaSalary> lqw = new QueryWrapper<>(); QueryWrapper<OaSalary> lqw = new QueryWrapper<>();
lqw.in("os.user_id",userIds); lqw.in("os.user_id",userIds);
Page<OaSalaryVo> result = baseMapper.selectStaffVoPage(pageQuery.build(), lqw,bo.getPayTime()); Date payTime = bo.getPayTime()!=null?bo.getPayTime():new Date();
Page<OaSalaryVo> result = baseMapper.selectStaffVoPage(pageQuery.build(), lqw,payTime);
if (result.getRecords().isEmpty()){
// 判断是否有当前月的记录 没有则进行创造新的记录
this.importSalaryUser();
result = baseMapper.selectStaffVoPage(pageQuery.build(), lqw,payTime);
}
return TableDataInfo.build(result); return TableDataInfo.build(result);
} }
@@ -199,6 +216,9 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
String jsonPath = OwnHttpUtils.getJsonName(bo.getMonthStr(), bo.getFilePath()); String jsonPath = OwnHttpUtils.getJsonName(bo.getMonthStr(), bo.getFilePath());
// 2拿到所有的用户 // 2拿到所有的用户
Date yearMonth = StringToDate(combineYearMonth(bo.getMonthStr())); Date yearMonth = StringToDate(combineYearMonth(bo.getMonthStr()));
// 添加去重思想 即拿到月份如果之前计算过,则将原来的全部删掉然后新增新的
baseMapper.delByPayTime(yearMonth);
List<SysUser> sysUsers = userService.selectUserList2(); List<SysUser> sysUsers = userService.selectUserList2();
// 3遍历user列表 拿出所有的nickName分别拿到他们的json 进行第二步分析 // 3遍历user列表 拿出所有的nickName分别拿到他们的json 进行第二步分析
for (SysUser user : sysUsers) { for (SysUser user : sysUsers) {
@@ -277,6 +297,11 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
}); });
} }
} }
List<String> days = getDays(bo, res.getAbsentDates());
res.setAbsentDates(days);
List<String> days05 = getDays(bo, res.getAbsent05Dates());
res.setAbsentDates(days);
res.setAbsent05Dates(days05);
buildItemAbsent(res.getAbsentDates(), salary,1.0,yearMonth); buildItemAbsent(res.getAbsentDates(), salary,1.0,yearMonth);
buildItemAbsent(res.getAbsent05Dates(), salary,0.5,yearMonth); buildItemAbsent(res.getAbsent05Dates(), salary,0.5,yearMonth);
@@ -350,6 +375,20 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
return "计算成功"; return "计算成功";
} }
private List<String> getDays(OaSalaryBo bo, List<String> res) {
List<String> days = new ArrayList<>();
for (String absentDate : res) {
String dateString = combineYearMonthAndDay(bo.getMonthStr(), absentDate);
Date date = StringToDate(dateString);
SysOaAttendanceBo sysOaAttendanceBo = new SysOaAttendanceBo();
sysOaAttendanceBo.setCreateTime(date);
SysOaAttendanceVo sysOaAttendanceVo = sysOaAttendanceService.queryList(sysOaAttendanceBo).get(0);
if (sysOaAttendanceVo != null && sysOaAttendanceVo.getProjectId()!=0) {
days.add(absentDate);
}
}
return days;
}
private void buildItemAbsent(List<String> realDate2, OaSalary salary,Double flag,Date yearMonth) { private void buildItemAbsent(List<String> realDate2, OaSalary salary,Double flag,Date yearMonth) {
@@ -378,6 +417,7 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
salaryItemMapper.insert(oaSalaryItem); salaryItemMapper.insert(oaSalaryItem);
} }
/** /**
* 获取从 startTime 到 endTime含首尾的所有日期列表 * 获取从 startTime 到 endTime含首尾的所有日期列表
* *

View File

@@ -84,6 +84,7 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService {
lqw.eq(bo.getProjectId() != null, SysOaAttendance::getProjectId, bo.getProjectId()); lqw.eq(bo.getProjectId() != null, SysOaAttendance::getProjectId, bo.getProjectId());
lqw.eq(bo.getDayLength() != null, SysOaAttendance::getDayLength, bo.getDayLength()); lqw.eq(bo.getDayLength() != null, SysOaAttendance::getDayLength, bo.getDayLength());
lqw.eq(bo.getHour() != null, SysOaAttendance::getHour, bo.getHour()); lqw.eq(bo.getHour() != null, SysOaAttendance::getHour, bo.getHour());
lqw.like(bo.getCreateTime()!=null, SysOaAttendance::getCreateTime, bo.getCreateTime());
return lqw; return lqw;
} }
@@ -123,8 +124,6 @@ public class SysOaAttendanceServiceImpl implements ISysOaAttendanceService {
sysOaAttendanceVo.setDelFlag(0L); sysOaAttendanceVo.setDelFlag(0L);
sysOaAttendanceVo.setDayLength(bo.getDayLength()!=null?bo.getDayLength():0); sysOaAttendanceVo.setDayLength(bo.getDayLength()!=null?bo.getDayLength():0);
sysOaAttendanceVo.setHour(bo.getHour()!=null?bo.getHour():0); sysOaAttendanceVo.setHour(bo.getHour()!=null?bo.getHour():0);
return baseMapper.updateDelAttendance(BeanUtil.toBean(sysOaAttendanceVo, SysOaAttendance.class)) > 0; return baseMapper.updateDelAttendance(BeanUtil.toBean(sysOaAttendanceVo, SysOaAttendance.class)) > 0;
} }

View File

@@ -32,7 +32,6 @@
os.salary_id, os.salary_id,
os.user_id, os.user_id,
os.pay_time, os.pay_time,
os.base_salary,
( (
COALESCE(SUM( COALESCE(SUM(
CASE CASE
@@ -44,7 +43,8 @@
) AS real_salary, ) AS real_salary,
osi.salary_item_id, osi.salary_item_id,
osi.sign_time, osi.sign_time,
su.nick_name su.nick_name,
labor_cost as base_salary
FROM oa_salary os FROM oa_salary os
LEFT JOIN oa_salary_item osi LEFT JOIN oa_salary_item osi
ON osi.salary_id = os.salary_id ON osi.salary_id = os.salary_id