diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaSalaryController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaSalaryController.java index bcfb3f5..d6baf54 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaSalaryController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaSalaryController.java @@ -53,7 +53,7 @@ public class OaSalaryController extends BaseController { @SaCheckPermission("oa:salary:list") @GetMapping("/list-worker") public TableDataInfo 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 getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long salaryId) { - return R.ok(iOaSalaryService.queryById(salaryId)); + @GetMapping("/detail") + public R getInfo(@RequestBody OaSalaryBo bo) { + return R.ok(iOaSalaryService.queryById(bo.getSalaryId(),bo.getPayTime())); } /** diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaSalaryVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaSalaryVo.java index d8c528f..14a05a2 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaSalaryVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaSalaryVo.java @@ -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 itemList; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaSalaryMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaSalaryMapper.java index ad13f42..545f223 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaSalaryMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaSalaryMapper.java @@ -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 { - Page selectStaffVoPage(Page build,@Param(Constants.WRAPPER) Wrapper lqw); + Page selectStaffVoPage(Page build,@Param(Constants.WRAPPER) Wrapper lqw,@Param("payTime") Date payTime); OaSalary selectVoByUserId(Long userId); + + OaSalaryVo selectVoAndItemVoById(@Param("salaryId")Long salaryId,@Param("payTime")Date payTime); + + void delByPayTime(Date date); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaSalaryService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaSalaryService.java index faff538..057b966 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaSalaryService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaSalaryService.java @@ -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 importSalaryUser(); + + TableDataInfo listWorker(OaSalaryBo bo, PageQuery pageQuery); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaSalaryServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaSalaryServiceImpl.java index 66bb6bf..8f14208 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaSalaryServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaSalaryServiceImpl.java @@ -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 queryPageList(OaSalaryBo bo, PageQuery pageQuery) { - LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.selectStaffVoPage(pageQuery.build(), lqw); + + List userIds = sysUserRoleMapper.selectUserIdsByNotRoleId(1852970465740505090L); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.in("os.user_id",userIds); + Page result = baseMapper.selectStaffVoPage(pageQuery.build(), lqw,bo.getPayTime()); + return TableDataInfo.build(result); + } + + + @Override + public TableDataInfo listWorker(OaSalaryBo bo, PageQuery pageQuery) { + List userIds = sysUserRoleMapper.selectUserIdsByRoleId(1852970465740505090L); + QueryWrapper lqw = new QueryWrapper<>(); + lqw.in("os.user_id",userIds); + Page result = baseMapper.selectStaffVoPage(pageQuery.build(), lqw,bo.getPayTime()); return TableDataInfo.build(result); } @Override public R importSalaryUser() { List 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 params = bo.getParams(); LambdaQueryWrapper 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 absentDates = res.getAbsentDates(); List realDates = new ArrayList<>(); List 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 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 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 realDate2, OaSalary salary,Double flag,Date yearMonth) { // 最终这个为缺勤日期 + if (realDate2.isEmpty()) { + return; + } OaSalaryItem oaSalaryItem = new OaSalaryItem(); StringBuilder sb = new StringBuilder(); // 接下来将他拼接成一个字符串为扣款原因矿工问题 diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/utils/OwnHttpUtils.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/utils/OwnHttpUtils.java index bd361d6..c98c2a5 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/utils/OwnHttpUtils.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/utils/OwnHttpUtils.java @@ -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); + } + } diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaSalaryMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaSalaryMapper.xml index 49f4c45..71af437 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/OaSalaryMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaSalaryMapper.xml @@ -20,6 +20,13 @@ + + DELETE FROM oa_salary + WHERE YEAR(pay_time) = YEAR(#{payTime}) + AND MONTH(pay_time) = MONTH(#{payTime}) + + + + + diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java index be8fb8f..74a8d4e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java @@ -14,4 +14,5 @@ public interface SysUserRoleMapper extends BaseMapperPlus selectUserIdsByRoleId(Long roleId); + List selectUserIdsByNotRoleId(Long roleId); } diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml index 5a55fcb..d3436d6 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml @@ -14,4 +14,10 @@ on u.user_id = sur.user_id and sur.role_id = #{roleId} + + diff --git a/ruoyi-ui/src/api/oa/salary.js b/ruoyi-ui/src/api/oa/salary.js index e5a6200..d069a1e 100644 --- a/ruoyi-ui/src/api/oa/salary.js +++ b/ruoyi-ui/src/api/oa/salary.js @@ -1,11 +1,11 @@ import request from '@/utils/request' /** - * 根据月份和文件计算工资 - * @param {*} param0.monthStr: 月份 - * @param {*} param0.filePath: 文件路径 - * @returns - */ +  * 根据月份和文件计算工资 +  * @param {*} param0.monthStr: 月份 +  * @param {*} param0.filePath: 文件路径 +  * @returns  +  */ export function calculateSalary({ monthStr, filePath }) { return request({ url: '/oa/salary/calc', @@ -16,10 +16,18 @@ export function calculateSalary({ monthStr, filePath }) { } }) } +// 查询职工薪资列表 +export function listStaff(query) { + return request({ + url: '/oa/salary/list-staff', + method: 'get', + params: query + }) +} /** - * oss文件上传 - */ +  * oss文件上传 +  */ export function uploadOssFile(data) { return request({ url: '/system/oss/upload', @@ -29,4 +37,4 @@ export function uploadOssFile(data) { 'Content-Type': 'multipart/form-data' } }) -} \ No newline at end of file +} diff --git a/ruoyi-ui/src/views/oa/peoples/salary/staff/index.vue b/ruoyi-ui/src/views/oa/peoples/salary/staff/index.vue index 05fd05d..90a6843 100644 --- a/ruoyi-ui/src/views/oa/peoples/salary/staff/index.vue +++ b/ruoyi-ui/src/views/oa/peoples/salary/staff/index.vue @@ -6,7 +6,7 @@ - - + - + 取消 确认上传 - + :disabled="isUploading" + > {{ isUploading ? '计算中...' : '开始计算' }} @@ -87,7 +88,7 @@ - +
合计人数:{{currentResult.length}} 人 总金额:¥ {{totalAmount}} @@ -98,7 +99,7 @@