diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaEmployeeTemplateBindingController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaEmployeeTemplateBindingController.java index 4bdb173..ed76c9f 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaEmployeeTemplateBindingController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaEmployeeTemplateBindingController.java @@ -124,7 +124,7 @@ public class OaEmployeeTemplateBindingController extends BaseController { } // 7. 批量确认发放 @PostMapping("/finalize") - public R finalizeSalary(@RequestBody List bindingIds) { + public R finalizeSalary(@RequestBody List bindingIds ) { return toAjax(iOaEmployeeTemplateBindingService.finalizeSalary(bindingIds)); } // 8. 查询单员工历史发放记录 diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaEmployeeTemplateBindingVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaEmployeeTemplateBindingVo.java index f4e8ca8..81df061 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaEmployeeTemplateBindingVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaEmployeeTemplateBindingVo.java @@ -83,6 +83,7 @@ public class OaEmployeeTemplateBindingVo { @ExcelProperty(value = "备注") private String remark; - + @ExcelProperty(value = "实发工资") + private BigDecimal totalSalary; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaEmployeeMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaEmployeeMapper.java index ad15aa8..8ede4b2 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaEmployeeMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaEmployeeMapper.java @@ -12,6 +12,5 @@ import org.springframework.data.repository.query.Param; * @date 2025-06-23 */ public interface OaEmployeeMapper extends BaseMapperPlus { - Long getDefaultInsuranceTemplateId(@Param("employeeId") Long employeeId); - Long getDefaultSalaryTemplateId(@Param("employeeId") Long employeeId); + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaEmployeeTemplateBindingMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaEmployeeTemplateBindingMapper.java index 012b79c..1078f06 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaEmployeeTemplateBindingMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaEmployeeTemplateBindingMapper.java @@ -3,7 +3,7 @@ package com.ruoyi.oa.mapper; import com.ruoyi.oa.domain.OaEmployeeTemplateBinding; import com.ruoyi.oa.domain.vo.OaEmployeeTemplateBindingVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; -import org.springframework.data.repository.query.Param; +import org.apache.ibatis.annotations.Param; /** * 员工模板绑定及月度发放记录Mapper接口 diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaInsuranceTemplateDetailMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaInsuranceTemplateDetailMapper.java index 2ca2459..02420a5 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaInsuranceTemplateDetailMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaInsuranceTemplateDetailMapper.java @@ -3,7 +3,7 @@ package com.ruoyi.oa.mapper; import com.ruoyi.oa.domain.OaInsuranceTemplateDetail; import com.ruoyi.oa.domain.vo.OaInsuranceTemplateDetailVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; -import org.springframework.data.repository.query.Param; +import org.apache.ibatis.annotations.Param; import java.util.List; diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaSalaryTemplateDetailMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaSalaryTemplateDetailMapper.java index a317545..fb4ef0b 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaSalaryTemplateDetailMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaSalaryTemplateDetailMapper.java @@ -3,7 +3,7 @@ package com.ruoyi.oa.mapper; import com.ruoyi.oa.domain.OaSalaryTemplateDetail; import com.ruoyi.oa.domain.vo.OaSalaryTemplateDetailVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; -import org.springframework.data.repository.query.Param; +import org.apache.ibatis.annotations.Param; import java.util.List; diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaEmployeeTemplateBindingService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaEmployeeTemplateBindingService.java index 2a18c9c..a4c41c6 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaEmployeeTemplateBindingService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaEmployeeTemplateBindingService.java @@ -49,6 +49,6 @@ public interface IOaEmployeeTemplateBindingService { Boolean deleteWithValidByIds(Collection ids, Boolean isValid); Boolean calculateSalary(List employeeIds, Long payYear, Long payMonth,Long defaultInsuranceTemplateId, Long defaultSalaryTemplateId); - Boolean finalizeSalary(List bindingIds); + Boolean finalizeSalary(List bindingIds); List querySalaryHistory(Long employeeId); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaEmployeeTemplateBindingServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaEmployeeTemplateBindingServiceImpl.java index 37b8cc8..542933a 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaEmployeeTemplateBindingServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaEmployeeTemplateBindingServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.oa.service.impl; import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.PageQuery; @@ -20,6 +21,7 @@ import com.ruoyi.oa.domain.vo.OaEmployeeTemplateBindingVo; import com.ruoyi.oa.service.IOaEmployeeTemplateBindingService; import java.math.BigDecimal; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Collection; @@ -61,9 +63,54 @@ public class OaEmployeeTemplateBindingServiceImpl implements IOaEmployeeTemplate public TableDataInfo queryPageList(OaEmployeeTemplateBindingBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + // 根据bindingid和template_type(salary)去求和paid_amount字段 + if (CollectionUtils.isNotEmpty(result.getRecords())) { + // 提取所有bindingId + List bindingIds = result.getRecords().stream() + .map(OaEmployeeTemplateBindingVo::getBindingId) + .collect(Collectors.toList()); + + // 批量查询每个bindingId对应的薪资总额 + Map salaryTotalMap = calculateSalaryTotalByBindingIds(bindingIds); + + // 将计算结果设置到对应的VO对象中 + for (OaEmployeeTemplateBindingVo vo : result.getRecords()) { + vo.setTotalSalary(salaryTotalMap.getOrDefault(vo.getBindingId(), BigDecimal.ZERO)); + } + } + return TableDataInfo.build(result); } + /** + * 根据绑定记录ID集合批量计算薪资总额 + * @param bindingIds 绑定记录ID集合 + * @return 绑定记录ID与薪资总额的映射关系 + */ + private Map calculateSalaryTotalByBindingIds(List bindingIds) { + if (CollectionUtils.isEmpty(bindingIds)) { + return Collections.emptyMap(); + } + // 创建查询条件 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(OaBindingItemDetail::getBindingId, bindingIds) + .eq(OaBindingItemDetail::getTemplateType, "salary") // 只查询薪资类型 + .eq(OaBindingItemDetail::getDelFlag, 0); // 只查询未删除的记录 + + // 查询所有符合条件的明细记录 + List details = bindingItemDetailMapper.selectList(queryWrapper); + + // 使用流处理按bindingId分组并计算总额 + return details.stream() + .collect(Collectors.groupingBy( + OaBindingItemDetail::getBindingId, + Collectors.reducing( + BigDecimal.ZERO, + OaBindingItemDetail::getPaidAmount, + BigDecimal::add + ) + )); + } /** * 查询员工模板绑定及月度发放记录列表 */ @@ -135,6 +182,7 @@ public class OaEmployeeTemplateBindingServiceImpl implements IOaEmployeeTemplate if (defaultInsuranceTemplateId == null || defaultSalaryTemplateId == null) { throw new RuntimeException("请选择默认的薪资模板和社保模板"); } + for (Long employeeId : employeeIds) { // 1. 检查本月是否已存在记录 OaEmployeeTemplateBinding exist = baseMapper.findByEmployeeAndMonth(employeeId, payYear, payMonth); @@ -175,6 +223,8 @@ public class OaEmployeeTemplateBindingServiceImpl implements IOaEmployeeTemplate binding.setPayYear(payYear); binding.setPayMonth(payMonth); binding.setStatus("待发"); +// binding.setNetSalary(BigDecimal.ZERO); // 确保设置默认值 +// binding.setTotalCompanyCost(BigDecimal.ZERO); baseMapper.insert(binding); // 4. 生成明细快照 @@ -194,6 +244,8 @@ public class OaEmployeeTemplateBindingServiceImpl implements IOaEmployeeTemplate item.setTemplateType("salary"); item.setItemDetailId(detail.getSalaryDetailId()); item.setPaidAmount(paidAmount); + //打印item + System.out.println("item:"+item); bindingItemDetailMapper.insert(item); } @@ -214,7 +266,6 @@ public class OaEmployeeTemplateBindingServiceImpl implements IOaEmployeeTemplate BigDecimal netSalary = totalSalary; //TODO 可扩展:减去个税、个人社保等 BigDecimal totalCompanyCost = netSalary.add(totalCompanyInsurance); - binding.setNetSalary(netSalary); binding.setTotalCompanyCost(totalCompanyCost); baseMapper.updateById(binding); @@ -224,11 +275,12 @@ public class OaEmployeeTemplateBindingServiceImpl implements IOaEmployeeTemplate @Override - public Boolean finalizeSalary(List bindingIds) { - for (Long id : bindingIds) { + public Boolean finalizeSalary(List bindingIds) { + for (String id : bindingIds) { OaEmployeeTemplateBinding binding = baseMapper.selectById(id); if (binding != null && !"已发".equals(binding.getStatus())) { binding.setStatus("已发"); + //TODO 这里可以算到财务支出等逻辑 baseMapper.updateById(binding); } } diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaEmployeeTemplateBindingMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaEmployeeTemplateBindingMapper.xml index 9d342f7..7041067 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/OaEmployeeTemplateBindingMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaEmployeeTemplateBindingMapper.xml @@ -21,6 +21,11 @@ + + INSERT INTO oa_employee_template_binding + (employee_id, insurance_template_id, salary_template_id, pay_year, pay_month, net_salary, total_company_cost, status) + VALUES (#{employeeId}, #{insuranceTemplateId}, #{salaryTemplateId}, #{payYear}, #{payMonth}, #{netSalary}, #{totalCompanyCost}, #{status}) + - SELECT * FROM oa_insurance_template_detail WHERE template_id = #{templateId} + SELECT * FROM oa_insurance_template_detail WHERE insurance_template_id = #{templateId} diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaSalaryTemplateDetailMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaSalaryTemplateDetailMapper.xml index 1a0524a..afb74ca 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/OaSalaryTemplateDetailMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaSalaryTemplateDetailMapper.xml @@ -18,7 +18,7 @@