This commit is contained in:
2025-03-09 21:44:39 +08:00
parent b600f7f5af
commit b400a1e0bc
11 changed files with 248 additions and 106 deletions

View File

@@ -53,7 +53,7 @@ public class OaSalaryController extends BaseController {
@SaCheckPermission("oa:salary:list")
@GetMapping("/list-worker")
public TableDataInfo<OaSalaryVo> listWorker(OaSalaryBo bo, PageQuery pageQuery) {
return iOaSalaryService.queryPageList(bo, pageQuery);
return iOaSalaryService.listWorker(bo, pageQuery);
}
/**
@@ -78,13 +78,11 @@ public class OaSalaryController extends BaseController {
/**
* 获取薪资管理详细信息
*
* @param salaryId 主键
*/
@SaCheckPermission("oa:salary:query")
@GetMapping("/{salaryId}")
public R<OaSalaryVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long salaryId) {
return R.ok(iOaSalaryService.queryById(salaryId));
@GetMapping("/detail")
public R<OaSalaryVo> getInfo(@RequestBody OaSalaryBo bo) {
return R.ok(iOaSalaryService.queryById(bo.getSalaryId(),bo.getPayTime()));
}
/**

View File

@@ -10,7 +10,7 @@ import com.ruoyi.oa.domain.OaSalary;
import com.ruoyi.oa.domain.bo.OaSalaryBo;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
@@ -69,4 +69,5 @@ public class OaSalaryVo extends OaSalary {
@ExcelProperty(value = "备注")
private String remark;
private List<OaSalaryItemVo> itemList;
}

View File

@@ -9,6 +9,8 @@ import com.ruoyi.oa.domain.vo.OaSalaryVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
/**
* 薪资管理Mapper接口
*
@@ -17,8 +19,12 @@ import org.apache.ibatis.annotations.Param;
*/
public interface OaSalaryMapper extends BaseMapperPlus<OaSalaryMapper, OaSalary, OaSalaryVo> {
Page<OaSalaryVo> selectStaffVoPage(Page<Object> build,@Param(Constants.WRAPPER) Wrapper<OaSalary> lqw);
Page<OaSalaryVo> selectStaffVoPage(Page<Object> build,@Param(Constants.WRAPPER) Wrapper<OaSalary> lqw,@Param("payTime") Date payTime);
OaSalary selectVoByUserId(Long userId);
OaSalaryVo selectVoAndItemVoById(@Param("salaryId")Long salaryId,@Param("payTime")Date payTime);
void delByPayTime(Date date);
}

View File

@@ -6,7 +6,9 @@ import com.ruoyi.oa.domain.bo.OaSalaryBo;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import javax.validation.constraints.NotBlank;
import java.util.Collection;
import java.util.Date;
import java.util.List;
/**
@@ -20,7 +22,7 @@ public interface IOaSalaryService {
/**
* 查询薪资管理
*/
OaSalaryVo queryById(Long salaryId);
OaSalaryVo queryById(Long salaryId, @NotBlank Date payTime);
/**
* 查询薪资管理列表
@@ -61,4 +63,6 @@ public interface IOaSalaryService {
* @return
*/
R<Void> importSalaryUser();
TableDataInfo<OaSalaryVo> listWorker(OaSalaryBo bo, PageQuery pageQuery);
}

View File

@@ -1,6 +1,7 @@
package com.ruoyi.oa.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
@@ -14,6 +15,7 @@ import com.ruoyi.oa.domain.vo.SysOaHolidayVo;
import com.ruoyi.oa.mapper.OaSalaryItemMapper;
import com.ruoyi.oa.service.ISysOaHolidayService;
import com.ruoyi.oa.utils.OwnHttpUtils;
import com.ruoyi.system.mapper.SysUserRoleMapper;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.workflow.mapper.WfDeployFormMapper;
import com.ruoyi.workflow.service.IWfTaskService;
@@ -34,6 +36,7 @@ import com.ruoyi.oa.mapper.OaSalaryMapper;
import com.ruoyi.oa.service.IOaSalaryService;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
@@ -75,12 +78,15 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
@Autowired
private OaSalaryItemMapper salaryItemMapper;
@Autowired
private SysUserRoleMapper sysUserRoleMapper;
/**
* 查询薪资管理
*/
@Override
public OaSalaryVo queryById(Long salaryId){
return baseMapper.selectVoById(salaryId);
public OaSalaryVo queryById(Long salaryId,Date payTime){
return baseMapper.selectVoAndItemVoById(salaryId,payTime);
}
/**
@@ -88,14 +94,28 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
*/
@Override
public TableDataInfo<OaSalaryVo> queryPageList(OaSalaryBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<OaSalary> lqw = buildQueryWrapper(bo);
Page<OaSalaryVo> result = baseMapper.selectStaffVoPage(pageQuery.build(), lqw);
List<Long> userIds = sysUserRoleMapper.selectUserIdsByNotRoleId(1852970465740505090L);
QueryWrapper<OaSalary> lqw = new QueryWrapper<>();
lqw.in("os.user_id",userIds);
Page<OaSalaryVo> result = baseMapper.selectStaffVoPage(pageQuery.build(), lqw,bo.getPayTime());
return TableDataInfo.build(result);
}
@Override
public TableDataInfo<OaSalaryVo> listWorker(OaSalaryBo bo, PageQuery pageQuery) {
List<Long> userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L);
QueryWrapper<OaSalary> lqw = new QueryWrapper<>();
lqw.in("os.user_id",userIds);
Page<OaSalaryVo> result = baseMapper.selectStaffVoPage(pageQuery.build(), lqw,bo.getPayTime());
return TableDataInfo.build(result);
}
@Override
public R<Void> importSalaryUser() {
List<SysUser> sysUsers = userService.selectUserList2();
baseMapper.delByPayTime(new Date());
for (SysUser user : sysUsers) {
if(Objects.nonNull(user)){
OaSalary oaSalary = new OaSalary();
@@ -107,6 +127,8 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
}
return R.ok();
}
/**
* 查询薪资管理列表
*/
@@ -120,9 +142,6 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<OaSalary> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getUserId() != null, OaSalary::getUserId, bo.getUserId());
lqw.eq(bo.getRealSalary() != null, OaSalary::getRealSalary, bo.getRealSalary());
lqw.eq(bo.getPayTime() != null, OaSalary::getPayTime, bo.getPayTime());
lqw.eq(bo.getBaseSalary() != null, OaSalary::getBaseSalary, bo.getBaseSalary());
return lqw;
}
@@ -214,10 +233,9 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
Long endTimeItem = (Long) processVariables.get("endTimeItem");
}
// 计算缺席的某天是否请假或者出差
List<String> absentDates = res.getAbsentDates();
List<String> realDates = new ArrayList<>();
List<String> real05Dates = new ArrayList<>();
for (String absentDate : absentDates) {
for (String absentDate : res.getAbsentDates()) {
// 形如2024-11-01
String fullDate = combineYearMonthAndDay(bo.getMonthStr(), absentDate);
boolean contains = timeRange.contains(fullDate);
@@ -226,16 +244,18 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
realDates.add(fullDate);
}
}
for (String real05Date : real05Dates) {
for (String real05Date : res.getAbsent05Dates()) {
String fullDate = combineYearMonthAndDay(bo.getMonthStr(), real05Date);
boolean contains = timeRange.contains(fullDate);
if (!contains) {
real05Dates.add(fullDate);
}
}
res.setAbsentDates(realDates);
res.setAbsent05Dates(real05Dates);
// 这次已经将缺勤拿出来了 现在还要判断今天是否为节假日
List<String> realDate2 =new ArrayList<>();
for (String realDate : realDates) {
for (String realDate : res.getAbsentDates()) {
SysOaHolidayVo sysOaHolidayVo = holidayService.queryHolidayByDate(StringToDate(realDate));
if (sysOaHolidayVo != null && sysOaHolidayVo.getType()!=0 ) {
// 如果不为节假日则加入进去
@@ -243,7 +263,7 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
}
}
List<String> real05Date2 =new ArrayList<>();
for (String real05Date : real05Dates) {
for (String real05Date : res.getAbsent05Dates()) {
SysOaHolidayVo sysOaHolidayVo = holidayService.queryHolidayByDate(StringToDate(real05Date));
if (sysOaHolidayVo != null && sysOaHolidayVo.getType()!=0 ) {
// 如果不为节假日则加入进去
@@ -251,63 +271,80 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
}
}
buildItemAbsent(realDate2, salary,1.0,yearMonth);
buildItemAbsent(real05Date2, salary,0.5,yearMonth);
res.setAbsentDates(realDate2);
res.setAbsent05Dates(real05Date2);
});
}
}
buildItemAbsent(res.getAbsentDates(), salary,1.0,yearMonth);
buildItemAbsent(res.getAbsent05Dates(), salary,0.5,yearMonth);
// 3.4创建其他的item包括了好多罚金
// 3.4.1 迟到罚金
StringBuilder sb= new StringBuilder();
for (String lateDate : res.getLateDates()) {
sb.append(lateDate);
sb.append(",");
}
sb.append("迟到日期");
OaSalaryItem oaSalaryItem = new OaSalaryItem();
oaSalaryItem.setSalaryId(salary.getSalaryId());
oaSalaryItem.setPrice(Double.valueOf(res.getLateFee()));
oaSalaryItem.setType(4L);
oaSalaryItem.setFlag(0L);
oaSalaryItem.setReason(sb.toString());
oaSalaryItem.setSignTime(yearMonth);
salaryItemMapper.insert(oaSalaryItem);
StringBuilder sb= new StringBuilder();
if (!res.getLateDates().isEmpty()) {
for (String lateDate : res.getLateDates()) {
sb.append(lateDate);
sb.append(",");
}
sb.append("迟到");
oaSalaryItem.setSalaryId(salary.getSalaryId());
oaSalaryItem.setPrice(Double.valueOf(res.getLateFee()));
oaSalaryItem.setType(4L);
oaSalaryItem.setFlag(0L);
oaSalaryItem.setReason(sb.toString());
oaSalaryItem.setSignTime(yearMonth);
salaryItemMapper.insert(oaSalaryItem);
}
// 3.4.2 早退罚金
sb= new StringBuilder();
for (String lateDate : res.getLeaveEarly10Dates()) {
sb.append(lateDate);
sb.append(",");
if (!res.getLeaveEarly10Dates().isEmpty()) {
for (String lateDate : res.getLeaveEarly10Dates()) {
sb.append(lateDate);
sb.append(",");
}
sb.append("以上为早退十分钟日期");
}
sb.append("早退日期十分钟");
for (String lateDate : res.getLeaveEarly30Dates()) {
sb.append(lateDate);
sb.append(",");
if (!res.getLeaveEarly30Dates().isEmpty()) {
for (String lateDate : res.getLeaveEarly30Dates()) {
sb.append(lateDate);
sb.append(",");
}
sb.append("以上为早退三十分钟日期");
}
if (!res.getLeaveEarly30Dates().isEmpty() || !res.getLeaveEarly10Dates().isEmpty()) {
oaSalaryItem = new OaSalaryItem();
oaSalaryItem.setSalaryId(salary.getSalaryId());
oaSalaryItem.setPrice(Double.valueOf(res.getLeaveEarlyFee()));
oaSalaryItem.setType(5L);
oaSalaryItem.setFlag(0L);
oaSalaryItem.setReason(sb.toString());
oaSalaryItem.setSignTime(yearMonth);
salaryItemMapper.insert(oaSalaryItem);
}
sb.append("早退日期三十分钟");
oaSalaryItem = new OaSalaryItem();
oaSalaryItem.setSalaryId(salary.getSalaryId());
oaSalaryItem.setPrice(Double.valueOf(res.getLeaveEarlyFee()));
oaSalaryItem.setType(5L);
oaSalaryItem.setFlag(0L);
oaSalaryItem.setReason(sb.toString());
oaSalaryItem.setSignTime(yearMonth);
salaryItemMapper.insert(oaSalaryItem);
// 3.4.3 打卡罚金
sb= new StringBuilder();
for (String lateDate : res.getLateDates()) {
sb.append(lateDate);
sb.append(",");
if (!res.getLateDates().isEmpty()){
sb= new StringBuilder();
for (String lateDate : res.getLateDates()) {
sb.append(lateDate);
sb.append(",");
}
sb.append("未打卡");
oaSalaryItem = new OaSalaryItem();
oaSalaryItem.setSalaryId(salary.getSalaryId());
oaSalaryItem.setPrice(Double.valueOf(res.getNotAttendanceFee()));
oaSalaryItem.setType(6L);
oaSalaryItem.setFlag(0L);
oaSalaryItem.setReason(sb.toString());
oaSalaryItem.setSignTime(yearMonth);
salaryItemMapper.insert(oaSalaryItem);
}
sb.append("未打卡");
oaSalaryItem = new OaSalaryItem();
oaSalaryItem.setSalaryId(salary.getSalaryId());
oaSalaryItem.setPrice(Double.valueOf(res.getNotAttendanceFee()));
oaSalaryItem.setType(6L);
oaSalaryItem.setFlag(0L);
oaSalaryItem.setReason(sb.toString());
oaSalaryItem.setSignTime(yearMonth);
salaryItemMapper.insert(oaSalaryItem);
}
return "计算成功";
@@ -317,6 +354,9 @@ public class OaSalaryServiceImpl implements IOaSalaryService {
private void buildItemAbsent(List<String> realDate2, OaSalary salary,Double flag,Date yearMonth) {
// 最终这个为缺勤日期
if (realDate2.isEmpty()) {
return;
}
OaSalaryItem oaSalaryItem = new OaSalaryItem();
StringBuilder sb = new StringBuilder();
// 接下来将他拼接成一个字符串为扣款原因矿工问题

View File

@@ -10,6 +10,9 @@ import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
public class OwnHttpUtils {
@@ -25,9 +28,10 @@ public class OwnHttpUtils {
public static CalcResultVo getBaseCalc(String fileName, String personName) {
// 目标接口地址
String jsonBody = String.format("{\"file_name\":\"%s\",\"person_name\":\"%s\"}", fileName, personName);
jsonBody = getResult("get_person_info",jsonBody);
String jsonBody = String.format("{\"file_name\":%s,\"person_name\":\"%s\"}", fileName, personName);
System.out.println(jsonBody);
jsonBody = getResult("get_person_info",jsonBody);
// 1. 将 JSON 字符串解析成 JSONObject
JSONObject jsonObject = JSON.parseObject(jsonBody);
@@ -107,12 +111,7 @@ public class OwnHttpUtils {
}
public static void main(String[] args) {
String fileName = "/home/ubuntu/lyq/fad_oa_kqdeal/202411.json";
String personName = "丁苗松";
String jsonBody = String.format("{\"file_name\":\"%s\",\"person_name\":\"%s\"}", fileName, personName);
StringToDate("2025-03");
}
@@ -164,4 +163,20 @@ public class OwnHttpUtils {
return null;
}
}
private static Date StringToDate(String dateStr) {
// 1. 解析字符串到 YearMonth只包含年和月
YearMonth yearMonth = YearMonth.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM"));
// 2. 在 YearMonth 基础上指定“日”为 1
LocalDate localDate = yearMonth.atDay(1);
// 3. 转成 Instant
Instant instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();
// 4. 转成旧版本 Date
return Date.from(instant);
}
}

View File

@@ -20,6 +20,13 @@
</resultMap>
<delete id="delByPayTime" parameterType="Date">
DELETE FROM oa_salary
WHERE YEAR(pay_time) = YEAR(#{payTime})
AND MONTH(pay_time) = MONTH(#{payTime})
</delete>
<select id="selectStaffVoPage" resultMap="OaSalaryResult">
SELECT
os.salary_id,
@@ -45,13 +52,10 @@
AND YEAR(osi.sign_time) = YEAR(#{payTime})
AND MONTH(osi.sign_time) = MONTH(#{payTime})
LEFT JOIN sys_user su ON os.user_id = su.user_id
<where>
${ew.customSqlSegment}
and
YEAR(os.pay_time) = YEAR(#{payTime})
AND MONTH(os.pay_time) = MONTH(#{payTime})
<if test="ew != null and ew.customSqlSegment != null and ew.customSqlSegment != ''">
AND ${ew.customSqlSegment}
</if>
</where>
GROUP BY
os.salary_id,
os.user_id,
@@ -69,5 +73,48 @@
select * from oa_salary where user_id = #{userId}
</select>
<select id="selectVoAndItemVoById" resultType="com.ruoyi.oa.domain.vo.OaSalaryVo">
SELECT
os.salary_id,
os.user_id,
os.pay_time,
os.base_salary,
(
os.base_salary * DAY(LAST_DAY(#{payTime}))
+ COALESCE(SUM(
CASE
WHEN osi.flag = 1 THEN osi.price
WHEN osi.flag = 0 THEN -osi.price
ELSE 0
END
), 0)
) AS real_salary,
osi.salary_item_id,
osi.reason,
osi.price,
osi.sign_time,
su.nick_name
FROM oa_salary os
LEFT JOIN oa_salary_item osi
ON osi.salary_id = os.salary_id
AND YEAR(osi.sign_time) = YEAR(#{payTime})
AND MONTH(osi.sign_time) = MONTH(#{payTime})
LEFT JOIN sys_user su ON os.user_id = su.user_id
where os.salary_id = #{salaryId}
and
YEAR(os.pay_time) = YEAR(#{payTime})
AND MONTH(os.pay_time) = MONTH(#{payTime})
GROUP BY
os.salary_id,
os.user_id,
os.pay_time,
os.base_salary,
osi.salary_item_id,
osi.type,
osi.reason,
osi.price,
osi.sign_time
</select>
</mapper>