Merge remote-tracking branch 'origin/master'

master
wanglei 7 months ago
commit b198295a27

@ -12,6 +12,12 @@
<artifactId>ruoyi-pay</artifactId> <artifactId>ruoyi-pay</artifactId>
<dependencies> <dependencies>
<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.9</version>
</dependency>
<dependency> <dependency>
<groupId>org.testng</groupId> <groupId>org.testng</groupId>
<artifactId>testng</artifactId> <artifactId>testng</artifactId>

@ -49,7 +49,7 @@ public class PayDayWorkHoursController extends BaseController {
*/ */
@SaCheckPermission("pay:dayWorkHours:list") @SaCheckPermission("pay:dayWorkHours:list")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo<PayDayWorkHoursVo> list(PayDayWorkHoursBo bo, PageQuery pageQuery) { public TableDataInfo<PayDayWorkHoursQuery> list(PayDayWorkHoursBo bo, PageQuery pageQuery) {
return iPayDayWorkHoursService.queryPageList2(bo, pageQuery); return iPayDayWorkHoursService.queryPageList2(bo, pageQuery);
} }
@ -101,7 +101,7 @@ public class PayDayWorkHoursController extends BaseController {
*/ */
@SaCheckPermission("pay:dayWorkHours:query") @SaCheckPermission("pay:dayWorkHours:query")
@GetMapping("/{id}") @GetMapping("/{id}")
public R<PayDayWorkHoursVo> getInfo(@NotNull(message = "主键不能为空") public R<PayDayWorkHoursQuery> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) { @PathVariable Long id) {
return R.ok(iPayDayWorkHoursService.queryById(id)); return R.ok(iPayDayWorkHoursService.queryById(id));
} }

@ -49,7 +49,7 @@ public class PayEmployeeInfoController extends BaseController {
return iPayEmployeeInfoService.queryPageList(bo, pageQuery); return iPayEmployeeInfoService.queryPageList(bo, pageQuery);
} }
/** /**
* *
*/ */
@SaCheckPermission("pay:employeeInfo:list") @SaCheckPermission("pay:employeeInfo:list")
@GetMapping("/salesman") @GetMapping("/salesman")
@ -122,7 +122,12 @@ public class PayEmployeeInfoController extends BaseController {
@PutMapping("/edithour") @PutMapping("/edithour")
public R<Void> edit(@RequestParam("oldHour") String oldHour, @RequestParam("newHour") String newHour,@RequestParam("tenantId") Long tenantId) public R<Void> edit(@RequestParam("oldHour") String oldHour, @RequestParam("newHour") String newHour,@RequestParam("tenantId") Long tenantId)
{ {
return toAjax(iPayEmployeeInfoService.updateSgrEmployeeHour(oldHour,newHour,tenantId)); int result = iPayEmployeeInfoService.updateSgrEmployeeHour(oldHour,newHour,tenantId);
if(result>0){
return R.ok();
}else{
return R.fail("出勤小时:"+oldHour+" 不存在,系统没有做任何修改");
}
} }
/** /**

@ -6,6 +6,8 @@ import java.util.concurrent.TimeUnit;
import com.ruoyi.pay.domain.PaySalaryReport; import com.ruoyi.pay.domain.PaySalaryReport;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*; import javax.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
@ -59,9 +61,10 @@ public class PaySalaryReportController extends BaseController {
@SaCheckPermission("pay:salaryReport:export") @SaCheckPermission("pay:salaryReport:export")
@Log(title = "工资明细总", businessType = BusinessType.EXPORT) @Log(title = "工资明细总", businessType = BusinessType.EXPORT)
@PostMapping("/export") @PostMapping("/export")
public void export(PaySalaryReportBo bo, HttpServletResponse response) { public void export(PaySalaryReportBo bo, HttpServletRequest request, HttpServletResponse response) {
List<PaySalaryReportVo> list = iPaySalaryReportService.queryList(bo); List<PaySalaryReportVo> list = iPaySalaryReportService.queryList(bo);
ExcelUtil.exportExcel(list, "工资明细总", PaySalaryReportVo.class, response); ExcelUtil.exportExcel(list, "工资明细总", PaySalaryReportVo.class, response);
iPaySalaryReportService.export(request, response, list);
} }
/** /**
@ -86,6 +89,18 @@ public class PaySalaryReportController extends BaseController {
public R<Void> add(@Validated(AddGroup.class) @RequestBody PaySalaryReportBo bo) { public R<Void> add(@Validated(AddGroup.class) @RequestBody PaySalaryReportBo bo) {
return toAjax(iPaySalaryReportService.insertByBo(bo)); return toAjax(iPaySalaryReportService.insertByBo(bo));
} }
/**
*
*/
@SaCheckPermission("pay:salaryReport:add")
@Log(title = "工资明细总", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/generate")
public R<Void> generateSalaryReport(@RequestParam(name = "date") String date,
@RequestParam(name = "updateSupport")boolean updateSupport,
@RequestParam(name = "tenantId")Long tenantId) {
return iPaySalaryReportService.generateSalaryReport(date,updateSupport,tenantId);
}
/** /**
* *

@ -0,0 +1,45 @@
package com.ruoyi.pay.domain.vo;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.math.BigDecimal;
public class ButieMoneyAndTypes {
private String buTieName;
private BigDecimal money;
private String type;
public String getBuTieName() {
return buTieName;
}
public void setBuTieName(String buTieName) {
this.buTieName = buTieName;
}
public BigDecimal getMoney() {
return money;
}
public void setMoney(BigDecimal money) {
this.money = money;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("buTieName", getBuTieName())
.append("money", getMoney())
.append("type", getType())
.toString();
}
}

@ -1,11 +1,12 @@
package com.ruoyi.pay.domain.vo; package com.ruoyi.pay.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat; import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.converters.localdate.LocalDateDateConverter; import com.alibaba.excel.converters.localdate.LocalDateDateConverter;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
@ExcelIgnoreUnannotated
public class ExportBaohuoVo { public class ExportBaohuoVo {
/** 入库时间 */ /** 入库时间 */
@JsonFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd")

@ -0,0 +1,27 @@
package com.ruoyi.pay.enums;
/**
*
*/
public enum PayCalcType {
TYPE1("0", "日薪"), TYPE2("1", "月薪"),TYPE3("2", "喷涂按小时数"), TYPE4("3", "外贸按小时数"), TYPE5("4", "包月");
PayCalcType(String value, String text){
this.value = value;
this.text = text;
}
private String value;
private String text;
public String getValue() {
return value;
}
public String getText() {
return text;
}
}

@ -1,9 +1,12 @@
package com.ruoyi.pay.mapper; package com.ruoyi.pay.mapper;
import com.ruoyi.pay.domain.PayBaohuoEmployee; import com.ruoyi.pay.domain.PayBaohuoEmployee;
import com.ruoyi.pay.domain.bo.PayBaohuoEmployeeBo;
import com.ruoyi.pay.domain.vo.PayBaohuoEmployeeVo; import com.ruoyi.pay.domain.vo.PayBaohuoEmployeeVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.common.core.mapper.BaseMapperPlus;
import java.util.List;
/** /**
* Mapper * Mapper
* *
@ -12,4 +15,5 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
*/ */
public interface PayBaohuoEmployeeMapper extends BaseMapperPlus<PayBaohuoEmployeeMapper, PayBaohuoEmployee, PayBaohuoEmployeeVo> { public interface PayBaohuoEmployeeMapper extends BaseMapperPlus<PayBaohuoEmployeeMapper, PayBaohuoEmployee, PayBaohuoEmployeeVo> {
List<PayBaohuoEmployee> selectSgrBaohuoEmployeeList1(PayBaohuoEmployeeBo bhEmployee);
} }

@ -4,6 +4,7 @@ import com.ruoyi.pay.domain.PayButieEmplyee;
import com.ruoyi.pay.domain.vo.PayButieEmplyeeVo; import com.ruoyi.pay.domain.vo.PayButieEmplyeeVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update; import org.apache.ibatis.annotations.Update;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -18,4 +19,6 @@ public interface PayButieEmplyeeMapper extends BaseMapperPlus<PayButieEmplyeeMap
@Update("UPDATE pay_butie_emplyee SET money = #{money} WHERE butie_id = #{btid} AND employee_id = #{empId} AND date = #{date} ") @Update("UPDATE pay_butie_emplyee SET money = #{money} WHERE butie_id = #{btid} AND employee_id = #{empId} AND date = #{date} ")
Integer updateButieEmplyeeByDate(@Param("btid") Long btid, @Param("empId") Long empId, @Param("date") String date, @Param("money") BigDecimal money); Integer updateButieEmplyeeByDate(@Param("btid") Long btid, @Param("empId") Long empId, @Param("date") String date, @Param("money") BigDecimal money);
@Select("SELECT IFNULL(SUM(money),0) AS money FROM pay_butie_emplyee WHERE employee_id = #{empId} AND butie_id = #{butieId} AND date = #{date}")
BigDecimal getMoneyByInfo(Long id, Long id1, String date);
} }

@ -1,6 +1,7 @@
package com.ruoyi.pay.mapper; package com.ruoyi.pay.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.pay.domain.PayDayWorkHours; import com.ruoyi.pay.domain.PayDayWorkHours;
@ -21,7 +22,7 @@ public interface PayDayWorkHoursMapper extends BaseMapperPlus<PayDayWorkHoursMap
List<PayDayWorkHoursQuery> selectPayDayWorkHoursList2(PayDayWorkHoursQuery sgrDayWorkHoursQuery); List<PayDayWorkHoursQuery> selectPayDayWorkHoursList2(PayDayWorkHoursQuery sgrDayWorkHoursQuery);
Page<PayDayWorkHoursVo> selectVoPage2(@Param("page") Page<Object> page, @Param(Constants.WRAPPER)LambdaQueryWrapper<PayDayWorkHours> ew); Page<PayDayWorkHoursQuery> selectVoPage2(@Param("page") Page<Object> page, @Param(Constants.WRAPPER) QueryWrapper<PayDayWorkHours> ew);
PayDayWorkHoursVo selectDetailById(Long id); PayDayWorkHoursQuery selectDetailById(Long id);
} }

@ -16,9 +16,14 @@ import java.util.List;
* @date 2025-05-12 * @date 2025-05-12
*/ */
public interface PayEmployeeInfoMapper extends BaseMapperPlus<PayEmployeeInfoMapper, PayEmployeeInfo, PayEmployeeInfoVo> { public interface PayEmployeeInfoMapper extends BaseMapperPlus<PayEmployeeInfoMapper, PayEmployeeInfo, PayEmployeeInfoVo> {
@Update("update pay_employee_info e set e.hours_per_day = #{newHour} where e.hours_per_day = #{oldHour} and tenant_id = #{tenantId}") @Update("update pay_employee_info e set e.hours_per_day = #{newHour} where e.hours_per_day = #{oldHour} and tenant_id = #{tenantId} and deleted = 0 ")
int updateSgrEmployeeHour(@Param("oldHour") String oldHour, @Param("newHour")String newHour,@Param("tenantId") Long tenantId); int updateSgrEmployeeHour(@Param("oldHour") String oldHour, @Param("newHour")String newHour,@Param("tenantId") Long tenantId);
@Select("select * from pay_employee_info e ,sys_dept d where e.dept_id=d.dept_id and deleted = 0 and (d.dept_name='外贸' or d.dept_name='内贸') and tenant_id = #{tenantId}") @Select("select * from pay_employee_info e ,sys_dept d where e.dept_id=d.dept_id and deleted = 0 and (d.dept_name='外贸' or d.dept_name='内贸') and tenant_id = #{tenantId}")
List<PayEmployeeInfoVo> getSalesmanList(@Param("tenantId") Long tenantId); List<PayEmployeeInfoVo> getSalesmanList(@Param("tenantId") Long tenantId);
PayEmployeeInfo selectSgrEmployeeInfoByIdHasDel(Long id);
@Select("select dept_name from sys_dept where dept_id = #{deptId}")
String selectDeptNameByDeptNo(Long deptId);
} }

@ -1,9 +1,12 @@
package com.ruoyi.pay.mapper; package com.ruoyi.pay.mapper;
import com.ruoyi.pay.domain.PayWorkOrderEmployee; import com.ruoyi.pay.domain.PayWorkOrderEmployee;
import com.ruoyi.pay.domain.bo.PayWorkOrderEmployeeBo;
import com.ruoyi.pay.domain.vo.PayWorkOrderEmployeeVo; import com.ruoyi.pay.domain.vo.PayWorkOrderEmployeeVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.common.core.mapper.BaseMapperPlus;
import java.util.List;
/** /**
* Mapper * Mapper
* *
@ -12,4 +15,5 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
*/ */
public interface PayWorkOrderEmployeeMapper extends BaseMapperPlus<PayWorkOrderEmployeeMapper, PayWorkOrderEmployee, PayWorkOrderEmployeeVo> { public interface PayWorkOrderEmployeeMapper extends BaseMapperPlus<PayWorkOrderEmployeeMapper, PayWorkOrderEmployee, PayWorkOrderEmployeeVo> {
List<PayWorkOrderEmployee> selectPayWorkOrderEmployeeList1(PayWorkOrderEmployeeBo woEmployee);
} }

@ -23,7 +23,7 @@ public interface IPayDayWorkHoursService {
/** /**
* *
*/ */
PayDayWorkHoursVo queryById(Long id); PayDayWorkHoursQuery queryById(Long id);
/** /**
* *
@ -52,5 +52,5 @@ public interface IPayDayWorkHoursService {
public List<PayDayWorkHoursQuery> selectPayDayWorkHoursList2(PayDayWorkHoursQuery sgrDayWorkHoursQuery); public List<PayDayWorkHoursQuery> selectPayDayWorkHoursList2(PayDayWorkHoursQuery sgrDayWorkHoursQuery);
TableDataInfo<PayDayWorkHoursVo> queryPageList2(PayDayWorkHoursBo bo, PageQuery pageQuery); TableDataInfo<PayDayWorkHoursQuery> queryPageList2(PayDayWorkHoursBo bo, PageQuery pageQuery);
} }

@ -1,11 +1,14 @@
package com.ruoyi.pay.service; package com.ruoyi.pay.service;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.pay.domain.PaySalaryReport; import com.ruoyi.pay.domain.PaySalaryReport;
import com.ruoyi.pay.domain.vo.PaySalaryReportVo; import com.ruoyi.pay.domain.vo.PaySalaryReportVo;
import com.ruoyi.pay.domain.bo.PaySalaryReportBo; import com.ruoyi.pay.domain.bo.PaySalaryReportBo;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.PageQuery;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -51,4 +54,8 @@ public interface IPaySalaryReportService {
TableDataInfo<PaySalaryReportVo> queryLastMonthReport(Long tenantId, PageQuery pageQuery); TableDataInfo<PaySalaryReportVo> queryLastMonthReport(Long tenantId, PageQuery pageQuery);
void export(HttpServletRequest request, HttpServletResponse response, List<PaySalaryReportVo> list);
R<Void> generateSalaryReport(String date, boolean updateSupport, Long tenantId);
} }

@ -1,6 +1,7 @@
package com.ruoyi.pay.service.impl; package com.ruoyi.pay.service.impl;
import cn.hutool.core.bean.BeanUtil; 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.R;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
@ -49,7 +50,7 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService {
* *
*/ */
@Override @Override
public PayDayWorkHoursVo queryById(Long id){ public PayDayWorkHoursQuery queryById(Long id){
return baseMapper.selectDetailById(id); return baseMapper.selectDetailById(id);
} }
@ -66,9 +67,9 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService {
* *
*/ */
@Override @Override
public TableDataInfo<PayDayWorkHoursVo> queryPageList2(PayDayWorkHoursBo bo, PageQuery pageQuery) { public TableDataInfo<PayDayWorkHoursQuery> queryPageList2(PayDayWorkHoursBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<PayDayWorkHours> lqw = buildQueryWrapper(bo); QueryWrapper<PayDayWorkHours> lqw = buildQueryWrapper2(bo);
Page<PayDayWorkHoursVo> result = baseMapper.selectVoPage2(pageQuery.build(), lqw); Page<PayDayWorkHoursQuery> result = baseMapper.selectVoPage2(pageQuery.build(), lqw);
return TableDataInfo.build(result); return TableDataInfo.build(result);
} }
@ -81,6 +82,19 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService {
return baseMapper.selectVoList(lqw); return baseMapper.selectVoList(lqw);
} }
private QueryWrapper<PayDayWorkHours> buildQueryWrapper2(PayDayWorkHoursBo bo) {
Map<String, Object> params = bo.getParams();
QueryWrapper<PayDayWorkHours> lqw = Wrappers.query();;
lqw.eq(bo.getTenantId() != null, "d.tenant_id", bo.getTenantId());
lqw.eq(bo.getDeptId() != null, "dept_id", bo.getDeptId());
lqw.like(StringUtils.isNotBlank(bo.getDeptName()), "dept_name", bo.getDeptName());
lqw.eq(bo.getEmployeeId() != null, "employee_id", bo.getEmployeeId());
lqw.like(StringUtils.isNotBlank(bo.getEmpName()), "emp_name", bo.getEmpName());
lqw.eq(bo.getDate() != null, "date", bo.getDate());
lqw.eq(StringUtils.isNotBlank(bo.getDwYearMonth()), "year_month", bo.getDwYearMonth());
lqw.eq(StringUtils.isNotBlank(bo.getNote()), "note", bo.getNote());
return lqw;
}
private LambdaQueryWrapper<PayDayWorkHours> buildQueryWrapper(PayDayWorkHoursBo bo) { private LambdaQueryWrapper<PayDayWorkHours> buildQueryWrapper(PayDayWorkHoursBo bo) {
Map<String, Object> params = bo.getParams(); Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<PayDayWorkHours> lqw = Wrappers.lambdaQuery(); LambdaQueryWrapper<PayDayWorkHours> lqw = Wrappers.lambdaQuery();
@ -103,7 +117,7 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService {
public R<Void> insertByBo(PayDayWorkHoursQuery2 payDayWorkHoursQuery2) { public R<Void> insertByBo(PayDayWorkHoursQuery2 payDayWorkHoursQuery2) {
//先拆分员工 然后每个员工信息存储到SgrDayWorkHoursQuery集合中 //先拆分员工 然后每个员工信息存储到SgrDayWorkHoursQuery集合中
List<PayDayWorkHoursQuery> querys = new ArrayList<>(); List<PayDayWorkHoursQuery> querys = new ArrayList<>();
if(payDayWorkHoursQuery2.getEmpInfos()!=null&&payDayWorkHoursQuery2.getEmpInfos().size()>0){ if(payDayWorkHoursQuery2.getEmpInfos()==null||payDayWorkHoursQuery2.getEmpInfos().size()<=0){
return R.fail("添加工时的员工为空!"); return R.fail("添加工时的员工为空!");
} }
for(PayDayWorkEmps emp :payDayWorkHoursQuery2.getEmpInfos()){ for(PayDayWorkEmps emp :payDayWorkHoursQuery2.getEmpInfos()){
@ -115,6 +129,7 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService {
payDayWorkHoursQuery.setDwHoursContrasts(payDayWorkHoursQuery2.getDwHoursContrasts()); payDayWorkHoursQuery.setDwHoursContrasts(payDayWorkHoursQuery2.getDwHoursContrasts());
payDayWorkHoursQuery.setDwYearMonth(payDayWorkHoursQuery2.getDwYearMonth()); payDayWorkHoursQuery.setDwYearMonth(payDayWorkHoursQuery2.getDwYearMonth());
payDayWorkHoursQuery.setDate(payDayWorkHoursQuery2.getDate()); payDayWorkHoursQuery.setDate(payDayWorkHoursQuery2.getDate());
payDayWorkHoursQuery.setTenantId(payDayWorkHoursQuery2.getTenantId());
querys.add(payDayWorkHoursQuery); querys.add(payDayWorkHoursQuery);
} }
//验证每个员工信息是否符合添加条件 不符合则提示退出 //验证每个员工信息是否符合添加条件 不符合则提示退出
@ -156,15 +171,17 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService {
//存员工当日工作时间段 //存员工当日工作时间段
if (result > 0) { if (result > 0) {
List<PayDwHoursContrast> sgrDwHoursContrasts = sgrDayWorkHoursQuery.getDwHoursContrasts(); List<PayDwHoursContrast> sgrDwHoursContrasts = sgrDayWorkHoursQuery.getDwHoursContrasts();
sgrDwHoursContrasts.parallelStream().forEachOrdered(sgrDwHoursContrast -> { for(PayDwHoursContrast sgrDwHoursContrast:sgrDwHoursContrasts){
sgrDwHoursContrast.setId(null);
sgrDwHoursContrast.setDwHoursId(payDayWorkHour.getId()); sgrDwHoursContrast.setDwHoursId(payDayWorkHour.getId());
sgrDwHoursContrast.setTenantId(payDayWorkHoursQuery2.getTenantId());
if (sgrDwHoursContrast.getIsHelper() == 0) {//当不是帮工时 直接存员工的部门 if (sgrDwHoursContrast.getIsHelper() == 0) {//当不是帮工时 直接存员工的部门
sgrDwHoursContrast.setDeptId(sgrDayWorkHoursQuery.getDeptId()); sgrDwHoursContrast.setDeptId(sgrDayWorkHoursQuery.getDeptId());
sgrDwHoursContrast.setDeptName(sgrDayWorkHoursQuery.getDeptName()); sgrDwHoursContrast.setDeptName(sgrDayWorkHoursQuery.getDeptName());
} }
sgrDwHoursContrast.setHours(DateCompareUtil.getDatePoor(sgrDwHoursContrast.getStartTime(),sgrDwHoursContrast.getEndTime())); sgrDwHoursContrast.setHours(DateCompareUtil.getDatePoor(sgrDwHoursContrast.getStartTime(),sgrDwHoursContrast.getEndTime()));
dwHoursContrastMapper.insert(sgrDwHoursContrast); dwHoursContrastMapper.insert(sgrDwHoursContrast);
}); };
}else{ }else{
return R.ok("系统存储数据库过程中出现故障!"); return R.ok("系统存储数据库过程中出现故障!");
} }
@ -206,7 +223,8 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService {
//保存工时信息 //保存工时信息
sgrDayWorkHoursQuery.setDwYearMonth(getYearMonth(sgrDayWorkHoursQuery)); sgrDayWorkHoursQuery.setDwYearMonth(getYearMonth(sgrDayWorkHoursQuery));
PayDayWorkHours payDayWorkHour = BeanUtil.toBean(sgrDayWorkHoursQuery, PayDayWorkHours.class); PayDayWorkHours payDayWorkHour = BeanUtil.toBean(sgrDayWorkHoursQuery, PayDayWorkHours.class);
int result = baseMapper.insert(payDayWorkHour); // int result = baseMapper.insert(payDayWorkHour);
int result = baseMapper.updateById(payDayWorkHour);
//存员工当日工作时间段 //存员工当日工作时间段
if (result > 0) { if (result > 0) {
//采用先删除对应的时间段,然后重新添加的方式 //采用先删除对应的时间段,然后重新添加的方式
@ -216,8 +234,10 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService {
} }
//重新插入时间段 //重新插入时间段
List<PayDwHoursContrast> sgrDwHoursContrasts = sgrDayWorkHoursQuery.getDwHoursContrasts(); List<PayDwHoursContrast> sgrDwHoursContrasts = sgrDayWorkHoursQuery.getDwHoursContrasts();
sgrDwHoursContrasts.parallelStream().forEachOrdered(sgrDwHoursContrast -> { sgrDwHoursContrasts.stream().forEachOrdered(sgrDwHoursContrast -> {
sgrDwHoursContrast.setId(null);
sgrDwHoursContrast.setDwHoursId(payDayWorkHour.getId()); sgrDwHoursContrast.setDwHoursId(payDayWorkHour.getId());
sgrDwHoursContrast.setTenantId(sgrDayWorkHoursQuery.getTenantId());
if (sgrDwHoursContrast.getIsHelper() == 0) {//当不是帮工时 直接存员工的部门 if (sgrDwHoursContrast.getIsHelper() == 0) {//当不是帮工时 直接存员工的部门
sgrDwHoursContrast.setDeptId(sgrDayWorkHoursQuery.getDeptId()); sgrDwHoursContrast.setDeptId(sgrDayWorkHoursQuery.getDeptId());
sgrDwHoursContrast.setDeptName(sgrDayWorkHoursQuery.getDeptName()); sgrDwHoursContrast.setDeptName(sgrDayWorkHoursQuery.getDeptName());

@ -98,6 +98,7 @@ public class PayEmployeeInfoServiceImpl implements IPayEmployeeInfoService {
lqw.eq(bo.getHtstime() != null, PayEmployeeInfo::getHtstime, bo.getHtstime()); lqw.eq(bo.getHtstime() != null, PayEmployeeInfo::getHtstime, bo.getHtstime());
lqw.eq(bo.getHtetime() != null, PayEmployeeInfo::getHtetime, bo.getHtetime()); lqw.eq(bo.getHtetime() != null, PayEmployeeInfo::getHtetime, bo.getHtetime());
lqw.eq(bo.getDeleted() != null, PayEmployeeInfo::getDeleted, bo.getDeleted()); lqw.eq(bo.getDeleted() != null, PayEmployeeInfo::getDeleted, bo.getDeleted());
lqw.eq(bo.getDeleted() == null, PayEmployeeInfo::getDeleted, 0);
return lqw; return lqw;
} }

@ -1,24 +1,37 @@
package com.ruoyi.pay.service.impl; package com.ruoyi.pay.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.service.DictService;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.pay.domain.*;
import com.ruoyi.pay.domain.bo.*;
import com.ruoyi.pay.domain.vo.*;
import com.ruoyi.pay.enums.PayCalcType;
import com.ruoyi.pay.mapper.*;
import com.ruoyi.pay.util.SalaryExportUtil;
import com.ruoyi.system.service.ISysDictDataService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.pay.domain.bo.PaySalaryReportBo;
import com.ruoyi.pay.domain.vo.PaySalaryReportVo;
import com.ruoyi.pay.domain.PaySalaryReport;
import com.ruoyi.pay.mapper.PaySalaryReportMapper;
import com.ruoyi.pay.service.IPaySalaryReportService; import com.ruoyi.pay.service.IPaySalaryReportService;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import javax.annotation.Resource;
import java.util.Map; import javax.servlet.http.HttpServletRequest;
import java.util.Collection; import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/** /**
* Service * Service
@ -31,6 +44,41 @@ import java.util.Collection;
public class PaySalaryReportServiceImpl implements IPaySalaryReportService { public class PaySalaryReportServiceImpl implements IPaySalaryReportService {
private final PaySalaryReportMapper baseMapper; private final PaySalaryReportMapper baseMapper;
private final PayEmployeeInfoMapper payEmployeeInfoMapper;
private final DictService dictService;
@Resource
private PayBaohuoWorktimeMapper payBaohuoWorktimeMapper;
@Resource
private PayBaohuoWorktimeServiceImpl payBaohuoWorktimeService;
@Resource
private PayBaohuoEmployeeMapper sgrBaohuoEmployeeMapper;
@Resource
private PayButieEmplyeeMapper sgrButieEmplyeeMapper;
@Resource
private PayButieServiceImpl butieService;
@Resource
private PayWorkOrderEmployeeMapper sgrWorkOrderEmployeeMapper;
@Resource
private PayWorkTimeMapper sgrWorkTimeMapper;
@Resource
private PayWorkTimeServiceImpl payWorkTimeService;
@Resource
private PayRequireAttendanceReportMapper sgrRequireAttendanceReportMapper;
@Resource
private PayRequireAttendanceReportServiceImpl payRequireAttendanceReportService;
@Resource
private PayDayWorkHoursMapper sgrDayWorkHoursMapper;
@Resource
private PayDayWorkHoursServiceImpl payDayWorkHoursService;
@Resource
private PayDwHoursContrastMapper sgrDwHoursContrastMapper;
@Resource
private PayEmployeeInfoServiceImpl employeeInfoService;
@Resource
private PayEmployeeInfoMapper employeeInfoMapper;
@Resource
private PaySalaryReportMapper sgrSalaryReportMapper;
/** /**
* *
@ -158,4 +206,426 @@ public class PaySalaryReportServiceImpl implements IPaySalaryReportService {
return baseMapper.deleteBatchIds(ids) > 0; return baseMapper.deleteBatchIds(ids) > 0;
} }
@Override
public void export(HttpServletRequest request, HttpServletResponse response, List<PaySalaryReportVo> list) {
//创建excel表头
List<String> column = new ArrayList<>();
column.add("年");
column.add("月");
column.add("部门名称");
column.add("员工姓名");
column.add("基本工资");
column.add("实际出勤天数");
column.add("实际出勤小时数");
column.add("出勤工时");
column.add("包活工时");
column.add("加班工时");
column.add("日工帮工工时");
column.add("日工工资");
column.add("包活工资");
column.add("加班工资");
column.add("帮工工资");
//解决导出不同月份数据 并且月份中补贴项不同的情况
List<ButieMoneyAndTypes> allButie=new ArrayList<>();
for(PaySalaryReportVo report : list){
String jsonString = report.getAllButieData();
List<ButieMoneyAndTypes> butieMoney = JSON.parseArray(jsonString, ButieMoneyAndTypes.class);
allButie.addAll(butieMoney);
}
List<ButieMoneyAndTypes> buties = allButie.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()
-> new TreeSet<ButieMoneyAndTypes>(Comparator.comparing(ButieMoneyAndTypes :: getBuTieName))), ArrayList::new));
//获取type类型为1的补贴项
List<ButieMoneyAndTypes> butie1 = buties.stream().filter(butieMoney -> "1".equals(butieMoney.getType())).collect(Collectors.toList());
//获取type类型为0的补贴项
List<ButieMoneyAndTypes> butie0 = buties.stream().filter(butieMoney -> "0".equals(butieMoney.getType())).collect(Collectors.toList());
//循环遍历补贴项
for (ButieMoneyAndTypes butie : butie1) {
column.add(butie.getBuTieName());
}
column.add("应付工资");
for (ButieMoneyAndTypes butie : butie0) {
column.add(butie.getBuTieName());
}
//合并type补贴项 1的在前面
butie1.addAll(butie0);
column.add("实发工资");
column.add("开户行");
column.add("银行卡号");
column.add("备注说明"); //补贴项中有一项客户起名备注导致导出时被覆盖为真正的备注信息,这备注改名为备注说明避免上述情况
//表头对应的数据
List<Map<String, Object>> data = new ArrayList<>();
//遍历获取到的需要导出的数据k要和表头一样
for (int i = 0; i < list.size(); i++) {
Map<String, Object> dataMap = new HashMap<>();
PaySalaryReportVo sr = list.get(i);
int j = 0;
dataMap.put(column.get(j), sr.getYear());
dataMap.put(column.get(++j), sr.getMonth());
dataMap.put(column.get(++j), sr.getDeptName());
dataMap.put(column.get(++j), sr.getEmployeeName());
dataMap.put(column.get(++j), new BigDecimal(sr.getBasicSalary().stripTrailingZeros().toPlainString()));
dataMap.put(column.get(++j), sr.getActuallyDays());
dataMap.put(column.get(++j), sr.getActuallyHours());
dataMap.put(column.get(++j), sr.getDayWorkHours());
dataMap.put(column.get(++j), sr.getWorkOrderHours());
dataMap.put(column.get(++j), sr.getOvertimeWorkHours());
dataMap.put(column.get(++j), sr.getRigongHelpHours()); //客户要求添加日工帮工工时展示
dataMap.put(column.get(++j), new BigDecimal(sr.getDayWorkPay().stripTrailingZeros().toPlainString()));
dataMap.put(column.get(++j), new BigDecimal(sr.getWorkOrderPay().stripTrailingZeros().toPlainString()));
dataMap.put(column.get(++j), new BigDecimal(sr.getOvertime().stripTrailingZeros().toPlainString()));
dataMap.put(column.get(++j), new BigDecimal(sr.getBanggongPay().stripTrailingZeros().toPlainString()));
boolean flag2 = false;
//循环遍历补贴项
for (ButieMoneyAndTypes butie : butie1) {
// 获取该员工的补贴项
List<ButieMoneyAndTypes> butieMoneyList = JSON.parseArray(sr.getAllButieData(), ButieMoneyAndTypes.class);
// 获取到循环列对应的补贴项
List<ButieMoneyAndTypes> filterList = butieMoneyList.stream().filter(s -> s.getBuTieName().equals(butie.getBuTieName())).collect(Collectors.toList());
//补贴项完毕 添加应付工资 后面继续添加扣减项
if ("0".equals(butie.getType()) && !flag2) { // 扣减项
flag2 = true;
dataMap.put(column.get(++j), new BigDecimal(sr.getShoudPayMoney().stripTrailingZeros().toPlainString()));
}
//判断是否存在该项补贴 不存在存0
if(filterList!=null&&filterList.size()>0){
// 获取对应的补贴金额并去掉金额末尾多余的0
BigDecimal money = new BigDecimal(filterList.get(0).getMoney().stripTrailingZeros().toPlainString());
if (column.get(++j).equals(butie.getBuTieName())) {
dataMap.put(column.get(j), money);
}
}else{
if (column.get(++j).equals(butie.getBuTieName())) {
dataMap.put(column.get(j), new BigDecimal("0").stripTrailingZeros().toPlainString());
}
}
}
dataMap.put(column.get(++j), new BigDecimal(sr.getActuallyPayMoney().stripTrailingZeros().toPlainString()));
PayEmployeeInfo empInfo = payEmployeeInfoMapper.selectSgrEmployeeInfoByIdHasDel(sr.getEmployeeId());
if (ObjectUtil.isNotNull(empInfo)) {
dataMap.put(column.get(++j), empInfo.getOpeningBank());
dataMap.put(column.get(++j), empInfo.getBankCardNumber());
dataMap.put(column.get(++j), sr.getNote());
data.add(dataMap);
}
}
//调用导出工具类
SalaryExportUtil.exportExcel("工资明细表", column, data, request, response);
}
@Override
@Transactional
public R<Void> generateSalaryReport(String date, boolean updateSupport, Long tenantId) {
Integer successNums = 0;
Integer failedNums = 0;
StringBuffer successMsg = new StringBuffer();
StringBuffer failedMsg = new StringBuffer();
String year = date.split("-")[0];
String month = date.split("-")[1];
Date yearMonth;
try {
yearMonth = new SimpleDateFormat("yyyy-MM").parse(date);
} catch (ParseException e) {
e.printStackTrace();
return R.fail("系统日期格式转换错误");
}
PaySalaryReportBo re = new PaySalaryReportBo();
re.setTenantId(tenantId);
re.setYear(year);
re.setMonth(month);
List<PaySalaryReportVo> sgrSalaryReports = this.queryList(re);
if (sgrSalaryReports != null && sgrSalaryReports.size() > 0) {
if (updateSupport) {
//已有本月数据 做更新操作
List<Long> collect = sgrSalaryReports.stream().map(PaySalaryReportVo::getId).collect(Collectors.toList());
baseMapper.deleteBatchIds(collect);
} else {
return R.ok("如需更新生成报表,请勾选更新");
}
}
//1.拿到所有员工信息
//测试单个员工
/* SgrEmployeeInfo emp =new SgrEmployeeInfo();
emp.setName("卢志伟");
List<SgrEmployeeInfo> employeeInfoList = sgrEmployeeInfoMapper.selectSgrEmployeeInfoList(emp);*/
PayEmployeeInfoBo employeeInfoBo = new PayEmployeeInfoBo();
employeeInfoBo.setTenantId(tenantId);
List<PayEmployeeInfoVo> employeeInfoList = employeeInfoService.queryList(employeeInfoBo);
//获取所有补贴类型
PayButieBo butiebo = new PayButieBo();
butiebo.setTenantId(tenantId);
List<PayButieVo> sgrButies = butieService.queryList(butiebo);
for (PayEmployeeInfoVo employeeInfo : employeeInfoList) {
if (employeeInfo.getPayCalcType() == null) {
failedNums++;
failedMsg.append("<br/>" + employeeInfo.getName() + ":的工资计算类型不能为空");
continue;
}
if (employeeInfo.getBasicSalary() == null) {
failedNums++;
failedMsg.append("<br/>" + employeeInfo.getName() + ":的基本工资信息不能为空");
continue;
}
PaySalaryReport sgrSalaryReport = new PaySalaryReport();
String empName = employeeInfo.getName();
sgrSalaryReport.setTenantId(tenantId);
sgrSalaryReport.setEmployeeId(employeeInfo.getId());
sgrSalaryReport.setEmployeeName(employeeInfo.getName());
sgrSalaryReport.setYear(year);
sgrSalaryReport.setMonth(month);
sgrSalaryReport.setBasicSalary(employeeInfo.getBasicSalary());
sgrSalaryReport.setDeptId(employeeInfo.getDeptId());
//当type类型为包月时只能在此保存部门名称
String DeptName = employeeInfoMapper.selectDeptNameByDeptNo(employeeInfo.getDeptId());
sgrSalaryReport.setDeptName(DeptName);
//1.根据员工信息获取应出勤信息、包活及流程卡信息、补贴信息
//1.1获取应出勤信息
PayRequireAttendanceReportBo attendanceReport1 = new PayRequireAttendanceReportBo();
attendanceReport1.setTenantId(tenantId);
attendanceReport1.setEmpName(empName);
attendanceReport1.setYear(year);
attendanceReport1.setMonth(month);
PayRequireAttendanceReportVo attendanceReport =BeanUtil.toBean(attendanceReport1,PayRequireAttendanceReportVo.class);
BigDecimal yingchuqintianshu = BigDecimal.ZERO;
List<PayRequireAttendanceReportVo> attendanceReports = payRequireAttendanceReportService.queryList(attendanceReport1);
if (attendanceReports != null && attendanceReports.size() > 0) {
attendanceReport = attendanceReports.get(0);
if (attendanceReport.getRequireDays().equals(0L)) {
failedNums++;
failedMsg.append("<br/>错误:" + employeeInfo.getName() + "的应出勤天数为0");
continue;
}
if (attendanceReport.getLeaveDays() == null) {
attendanceReport.setLeaveDays(new BigDecimal("0"));
}
yingchuqintianshu = new BigDecimal(attendanceReport.getRequireDays());
sgrSalaryReport.setActuallyDays(attendanceReport.getAvtiveDays());
sgrSalaryReport.setActuallyHours(attendanceReport.getAttendanceHours());
sgrSalaryReport.setOvertimeWorkHours(attendanceReport.getOvertimeHours());
sgrSalaryReport.setNote(attendanceReport.getRemark());
} else if (!employeeInfo.getPayCalcType().equals(PayCalcType.TYPE5.getValue())) {
failedNums++;
failedMsg.append("<br/>未找到:" + employeeInfo.getName() + "的应出勤信息");
continue;
// return AjaxResult.error("未找到"+employeeInfo.getName()+"的应出勤信息");
}
//1.2获取员工日工工时信息
PayDayWorkHoursQuery sgrdayworkHoursQuery = new PayDayWorkHoursQuery();
BigDecimal rigongbanggong = BigDecimal.ZERO; //日工帮工小时数
sgrdayworkHoursQuery.setDwYearMonth(date);
sgrdayworkHoursQuery.setEmpName(employeeInfo.getName());
List<PayDayWorkHoursQuery> sgrDayWorkHoursQueryList = payDayWorkHoursService.selectPayDayWorkHoursList2(sgrdayworkHoursQuery);
if (sgrDayWorkHoursQueryList != null && sgrDayWorkHoursQueryList.size() > 0) {
for (PayDayWorkHoursQuery dayWorkHour : sgrDayWorkHoursQueryList) {
for (PayDwHoursContrast dwHoursContrast : dayWorkHour.getDwHoursContrasts()) {
if (dwHoursContrast.getIsHelper() == 1) {
BigDecimal datePoor = dwHoursContrast.getHours();
rigongbanggong = rigongbanggong.add(datePoor);
}
}
}
}
/*if(employeeInfo.getName().equals("赵向进")){ //测试使用的
System.out.println(".....");
}*/
sgrSalaryReport.setRigongHelpHours(rigongbanggong);//2023-10-16 客户要求展示日工帮工工时
//1.3获取员工包活及流程卡信息
//流程卡工时
PayWorkTimeBo workTime = new PayWorkTimeBo();
workTime.setEmpId(employeeInfo.getId());
workTime.setDate(yearMonth);
List<PayWorkTimeVo> sgrWorkTimes = payWorkTimeService.queryList(workTime);
BigDecimal baohuogongshi = BigDecimal.ZERO; //包活工时
if (sgrWorkTimes != null && sgrWorkTimes.size() > 0) {
for (PayWorkTimeVo time : sgrWorkTimes) {
baohuogongshi = baohuogongshi.add(time.getValidHours());
}
}
//包活工时
PayBaohuoWorktime bhtime = new PayBaohuoWorktime();
bhtime.setEmpId(employeeInfo.getId());
bhtime.setDate(yearMonth);
List<PayBaohuoWorktime> bhtimes = payBaohuoWorktimeMapper.selectBaohuoWorktimeList(bhtime);
if (bhtimes != null && bhtimes.size() > 0) {
for (PayBaohuoWorktime btime : bhtimes) {
baohuogongshi = baohuogongshi.add(btime.getValidHours());
}
}
//流程卡工资
BigDecimal baohuogongzi = BigDecimal.ZERO; //包活工资
BigDecimal baohuobanggongGZ = BigDecimal.ZERO;//包活帮工工资
PayWorkOrderEmployeeBo woEmployee = new PayWorkOrderEmployeeBo();
woEmployee.setEmpName(empName);
woEmployee.setIntime(yearMonth);
woEmployee.setTenantId(tenantId);
List<PayWorkOrderEmployee> woEmployees = sgrWorkOrderEmployeeMapper.selectPayWorkOrderEmployeeList1(woEmployee);
for (PayWorkOrderEmployee woe : woEmployees) {
if (woe.getHelper() == 0) {
baohuogongzi = baohuogongzi.add(woe.getAmount());
} else {
baohuobanggongGZ = baohuobanggongGZ.add(woe.getAmount());
}
}
//包活工资
PayBaohuoEmployeeBo bhEmployee = new PayBaohuoEmployeeBo();
bhEmployee.setTenantId(tenantId);
bhEmployee.setEmpName(empName);
bhEmployee.setIntime(yearMonth);
List<PayBaohuoEmployee> bhEmployees = sgrBaohuoEmployeeMapper.selectSgrBaohuoEmployeeList1(bhEmployee);
for (PayBaohuoEmployee bhe : bhEmployees) {
if (bhe.getHelper() == 0) {
baohuogongzi = baohuogongzi.add(bhe.getAmount());
} else {
baohuobanggongGZ = baohuobanggongGZ.add(bhe.getAmount());
}
}
sgrSalaryReport.setWorkOrderHours(baohuogongshi);
sgrSalaryReport.setWorkOrderPay(baohuogongzi.setScale(2, BigDecimal.ROUND_HALF_UP));
//1.4获取补贴信息
List<ButieMoneyAndTypes> butieMoneyAndTypesList = new ArrayList<>();
for (PayButieVo butie : sgrButies) {
ButieMoneyAndTypes butieMoneyAndType = new ButieMoneyAndTypes();
BigDecimal money = sgrButieEmplyeeMapper.getMoneyByInfo(employeeInfo.getId(), butie.getId(), date);
butieMoneyAndType.setBuTieName(butie.getName());
//补贴扣减全勤和津贴需要按比例发放
/* if(money.compareTo(BigDecimal.ZERO)!=0){
if((butie.getName().equals("全勤奖")||butie.getName().equals("岗位津贴"))&&!employeeInfo.getPayCalcType().equals(PayCalcType.TYPE5.getValue())
&&attendanceReport.getRequireDays().longValue()>attendanceReport.getAvtiveDays().longValue()){
BigDecimal moneyPerHour = money.divide(new BigDecimal(attendanceReport.getRequireDays()),4,BigDecimal.ROUND_HALF_UP)
.divide(employeeInfo.getHoursPerDay(),4,BigDecimal.ROUND_HALF_UP);
money =moneyPerHour.multiply(new BigDecimal(attendanceReport.getAvtiveDays()).multiply(employeeInfo.getHoursPerDay()).add(attendanceReport.getAttendanceHours()));
}
}*/
butieMoneyAndType.setMoney(money.setScale(2, BigDecimal.ROUND_HALF_UP));
butieMoneyAndType.setType(butie.getType());
butieMoneyAndTypesList.add(butieMoneyAndType);
}
sgrSalaryReport.setAllButieData(JSON.toJSONString(butieMoneyAndTypesList));
/* SgrButieEmplyee butieEmplyee = new SgrButieEmplyee();
butieEmplyee.setButieId(employeeInfo.getId());
butieEmplyee.setDate(date);
List<SgrButieEmplyee> butieEmplyeeList=sgrButieEmplyeeMapper.selectSgrButieEmplyeeList(butieEmplyee);
if(butieEmplyeeList!=null&&butieEmplyeeList.size()>0){
hasBuTie=true;
sgrSalaryReport.setAllBieteiData(JSON.toJSONString(butieEmplyeeList.get(0)));
}else{
sgrSalaryReport.setAllBieteiData(JSON.toJSONString(new SgrButieEmplyee()));
}*/
//根据不同计算类型计算
String payCalcType = employeeInfo.getPayCalcType();
BigDecimal yingfagongzi;
BigDecimal shifagongzi;
BigDecimal chuqingongshi = BigDecimal.ZERO;
BigDecimal jiabangongzi = BigDecimal.ZERO;
BigDecimal rigongbanggongGZ = BigDecimal.ZERO;
BigDecimal payPerHour;
if (!payCalcType.equals(PayCalcType.TYPE5.getValue())) {
//出勤工时=实际出勤天数*每日小时数+实际出勤小时数
chuqingongshi = new BigDecimal(sgrSalaryReport.getActuallyDays()).multiply(employeeInfo.getHoursPerDay()).add(sgrSalaryReport.getActuallyHours());
}
sgrSalaryReport.setDayWorkHours(chuqingongshi);
BigDecimal rigonggongzi = BigDecimal.ZERO;
//日工工时=出勤工时-包活工时-日工帮工
BigDecimal rigonghours = chuqingongshi.subtract(baohuogongshi).subtract(rigongbanggong);//日工工时数
/*0:(+)
1:(+)
2:(16/1717/18)
3.(17/21)
4.*/
switch (payCalcType) {
case "0": //工资计算类型:日薪(日工工资+包活工资)
//日工工资=基本工资/每日应出勤工时*日工工时
payPerHour = sgrSalaryReport.getBasicSalary().divide(employeeInfo.getHoursPerDay(), 4, BigDecimal.ROUND_HALF_UP);
rigonggongzi = payPerHour.multiply(rigonghours);
jiabangongzi = payPerHour.multiply(new BigDecimal("1.3")).multiply(sgrSalaryReport.getOvertimeWorkHours());
rigongbanggongGZ = payPerHour.multiply(rigongbanggong);
break;
case "1": //工资计算类型:月薪(日工工资+包活工资)
//小时工资=基本工资/应出勤天数/员工每日应出勤小时数
// 日工工资==小时工资 *(实际出勤天数 *员工每日应出勤小时数 +实际出勤小时数)
payPerHour = sgrSalaryReport.getBasicSalary().divide(yingchuqintianshu, 4, BigDecimal.ROUND_HALF_UP).
divide(employeeInfo.getHoursPerDay(), 4, BigDecimal.ROUND_HALF_UP);
rigonggongzi = payPerHour.multiply(rigonghours);
jiabangongzi = payPerHour.multiply(new BigDecimal("1.3")).multiply(sgrSalaryReport.getOvertimeWorkHours());
rigongbanggongGZ = payPerHour.multiply(rigongbanggong);
break;
case "2": //工资计算类型:喷涂按小时
//出勤工时需要达到234并且本月请假天数不能超过4天 工时工资按高工资计算
//客户需求修改去掉234小时的判断
//客户需求修改:喷涂计算时薪,符合条件原来+1元 现在改为+2元 将这个值2存储到字典中 hourpayDiff
//2024-8-15客户需求修改请假天数<=4天 原来+字典值+2元 改为不加钱, 将字典hourpayDiff值改为0--已修改 (并且新增如果请假大于4天扣200元——未修改客户自己加减)
// if (chuqingongshi.compareTo(new BigDecimal("234")) >= 0 && attendanceReport.getLeaveDays().compareTo(new BigDecimal("4")) <= 0) { //>=234小时 时薪+1元
if (attendanceReport.getLeaveDays().compareTo(new BigDecimal("4")) <= 0) { //符合条件: 时薪 +字典设定值 元
String diff = dictService.getDictValue("pay_hourpay_diff","diff");
payPerHour = sgrSalaryReport.getBasicSalary().add(new BigDecimal(diff));
} else {
payPerHour = sgrSalaryReport.getBasicSalary();
}
rigonggongzi = payPerHour.multiply(rigonghours);
rigongbanggongGZ = payPerHour.multiply(rigongbanggong);
break;
case "3": //工资计算类型:外贸按小时
rigonggongzi = sgrSalaryReport.getBasicSalary().multiply(rigonghours);
rigongbanggongGZ = sgrSalaryReport.getBasicSalary().multiply(rigongbanggong);
break;
case "4": //工资计算类型:包月
rigonggongzi = sgrSalaryReport.getBasicSalary();
break;
}
sgrSalaryReport.setDayWorkPay(rigonggongzi.setScale(2, BigDecimal.ROUND_HALF_UP));
sgrSalaryReport.setWorkOrderPay(baohuogongzi.setScale(2, BigDecimal.ROUND_HALF_UP));
sgrSalaryReport.setOvertime(jiabangongzi.setScale(2, BigDecimal.ROUND_HALF_UP));
//帮贡工资计算
BigDecimal banggonggongzi = baohuobanggongGZ.add(rigongbanggongGZ);
sgrSalaryReport.setBanggongPay(banggonggongzi.setScale(2, BigDecimal.ROUND_HALF_UP));
//应付工资=日工工资+包活工资+加班工资+帮工工资+增补项 值班、拉货工资 节假日工资 岗位津贴 补贴(话费及其他) 合同补助 全勤奖 帮工工资 上月差异
yingfagongzi = rigonggongzi.add(baohuogongzi).add(jiabangongzi).add(banggonggongzi);
//遍历补贴扣减项
BigDecimal koujianxiang = BigDecimal.ZERO;
for (ButieMoneyAndTypes butieMoney : butieMoneyAndTypesList) {
if (butieMoney.getType().equals("1")) {
yingfagongzi = yingfagongzi.add(butieMoney.getMoney());
} else {
koujianxiang = koujianxiang.add(butieMoney.getMoney());
}
}
//实发工资=应付工资-扣减项 迟到-党费
shifagongzi = yingfagongzi.subtract(koujianxiang);
sgrSalaryReport.setShoudPayMoney(yingfagongzi.setScale(2, BigDecimal.ROUND_HALF_UP));
sgrSalaryReport.setActuallyPayMoney(shifagongzi.setScale(0, BigDecimal.ROUND_HALF_UP));
int result = baseMapper.insert(sgrSalaryReport);
if (result > 0) {
successNums++;
successMsg.append("<br/>" + employeeInfo.getName() + "操作成功");
} else {
failedNums++;
failedMsg.append("<br/>" + employeeInfo.getName() + "添加到数据库时服务器异常");
}
}
if (failedNums > 0) {
failedMsg.insert(0, "生成成功:" + successNums + "条,生成失败:" + failedNums + "条,错误如下:");
return R.fail(failedMsg.toString());
} else {
successMsg.insert(0, "恭喜您,数据已全部生成成功!共 " + successNums + " 条,数据如下:");
}
return R.ok(successMsg.toString());
}
} }

@ -0,0 +1,81 @@
package com.ruoyi.pay.util;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import sun.misc.BASE64Encoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
public class SalaryExportUtil {
/**
* @param sheetName
* @param column
* @param data ( map column )
* @param response
*/
public static void exportExcel(String sheetName, List<String> column, List<Map<String,Object>> data, HttpServletRequest request, HttpServletResponse response){
//创建工作薄
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
//创建sheet
HSSFSheet sheet = hssfWorkbook.createSheet(sheetName);
// 表头
HSSFRow headRow = sheet.createRow(0);
//设置表头背景填充色
CellStyle style = hssfWorkbook.createCellStyle();
style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//设置表头字体颜色
HSSFFont font = hssfWorkbook.createFont();
font.setColor(IndexedColors.WHITE.getIndex());
font.setBold(true);
style.setFont(font);
for (int i = 0; i < column.size(); i++){
Cell titleCell =headRow.createCell(i);
titleCell.setCellStyle(style);
titleCell.setCellValue(column.get(i));
}
for (int i = 0; i < data.size(); i++) {
HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
for (int x = 0; x < column.size(); x++) {
dataRow.createCell(x).setCellValue(data.get(i).get(column.get(x))==null?"":data.get(i).get(column.get(x)).toString());
}
}
response.setContentType("application/vnd.ms-excel");
try {
//获取浏览器名称
String agent=request.getHeader("user-agent");
String filename=sheetName+".xls";
//不同浏览器需要对文件名做特殊处理
if (agent.contains("Firefox")) { // 火狐浏览器
filename = "=?UTF-8?B?"
+ new BASE64Encoder().encode(filename.getBytes("utf-8"))
+ "?=";
filename = filename.replaceAll("\r\n", "");
} else { // IE及其他浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+"," ");
}
//推送浏览器
response.setHeader("Content-Disposition","attachment;filename="+filename);
hssfWorkbook.write(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.pay.mapper.PayBaohuoEmployeeMapper">
<resultMap type="com.ruoyi.pay.domain.PayBaohuoEmployee" id="PayBaohuoEmployeeResult">
<result property="id" column="id"/>
<result property="tenantId" column="tenant_id"/>
<result property="woId" column="wo_id"/>
<result property="empId" column="emp_id"/>
<result property="deptId" column="dept_id"/>
<result property="empName" column="emp_name"/>
<result property="amount" column="amount"/>
<result property="month" column="month"/>
<result property="helper" column="helper"/>
<result property="intime" column="intime"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="remark" column="remark"/>
</resultMap>
<sql id="selectSgrBaohuoEmployeeVo">
select id, wo_id, emp_id, dept_id, emp_name, amount, month, helper, intime from pay_baohuo_employee
</sql>
<select id="selectSgrBaohuoEmployeeList1" resultMap="PayBaohuoEmployeeResult">
<include refid="selectSgrBaohuoEmployeeVo"/>
<where>
<if test="woId != null "> and wo_id = #{woId}</if>
<if test="tenantId != null "> and tenant_id = #{tenantId}</if>
<if test="empId != null "> and emp_id = #{empId}</if>
<if test="deptId != null "> and dept_id = #{deptId}</if>
<if test="empName != null and empName != ''"> and emp_name like concat('%', #{empName}, '%')</if>
<if test="amount != null "> and amount = #{amount}</if>
<if test="month != null and month != ''"> and month = #{month}</if>
<if test="helper != null "> and helper = #{helper}</if>
<if test="intime != null ">
<![CDATA[AND (DATE_FORMAT(`intime`, '%Y-%m') = DATE_FORMAT( #{intime}, '%Y-%m'))]]>
</if>
</where>
</select>
</mapper>

@ -17,6 +17,4 @@
<result property="updateTime" column="update_time"/> <result property="updateTime" column="update_time"/>
<result property="remark" column="remark"/> <result property="remark" column="remark"/>
</resultMap> </resultMap>
</mapper> </mapper>

@ -53,12 +53,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="note != null and note != ''"> and note = #{note}</if> <if test="note != null and note != ''"> and note = #{note}</if>
</where> </where>
</select> </select>
<select id="selectVoPage2" resultMap="PayDayWorkHoursQueryResult"> <select id="selectVoPage2" resultMap="PayDayWorkHoursQueryResult">
select d.*,c.start_time con_start,c.end_time con_end,c.is_helper con_helper,c.hours con_hours,c.salesman con_salesman from pay_day_work_hours d join pay_dw_hours_contrast c select d.*,c.start_time con_start,c.end_time con_end,c.is_helper con_helper,c.hours con_hours,c.salesman con_salesman from pay_day_work_hours d join pay_dw_hours_contrast c
on d.id=c.dw_hours_id on d.id=c.dw_hours_id
<where> ${ew.customSqlSegment}
${ew.sqlSegment}
</where>
</select> </select>
<select id="selectDetailById" parameterType="Long" resultMap="PayDayWorkHoursQueryResult"> <select id="selectDetailById" parameterType="Long" resultMap="PayDayWorkHoursQueryResult">

@ -39,5 +39,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="remark" column="remark"/> <result property="remark" column="remark"/>
</resultMap> </resultMap>
<sql id="selectSgrEmployeeInfoVo">
select id, user_id, sei.dept_id, name, sex, age, sei.phone, idcard, bank_card_number, opening_bank, basic_salary, day_salary, hour_salary, rest_type, hours_per_day, pay_calc_type, education, address, contact, contact_phone, zhijian, yewu, htstime, htetime, sei.deleted, sei.create_by, sei.create_time, sei.update_by, sei.update_time, sei.remark, sd.dept_name from pay_employee_info sei
left join sys_dept sd on sd.dept_id = sei.dept_id
</sql>
<select id="selectSgrEmployeeInfoByIdHasDel" parameterType="Long" resultMap="PayEmployeeInfoResult">
<include refid="selectSgrEmployeeInfoVo"/>
where id = #{id}
</select>
</mapper> </mapper>

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.pay.mapper.PayWorkOrderEmployeeMapper">
<resultMap type="com.ruoyi.pay.domain.PayWorkOrderEmployee" id="PayWorkOrderEmployeeResult">
<result property="id" column="id"/>
<result property="tenantId" column="tenant_id"/>
<result property="workOrderId" column="work_order_id"/>
<result property="employeeId" column="employee_id"/>
<result property="deptId" column="dept_id"/>
<result property="type" column="type"/>
<result property="empName" column="emp_name"/>
<result property="startTime" column="start_time"/>
<result property="endTime" column="end_time"/>
<result property="validHours" column="valid_hours"/>
<result property="date" column="date"/>
<result property="month" column="month"/>
<result property="processingType" column="processing_type"/>
<result property="processingPrice" column="processing_price"/>
<result property="processingNum" column="processing_num"/>
<result property="amount" column="amount"/>
<result property="helper" column="helper"/>
<result property="intime" column="intime"/>
</resultMap>
<sql id="selectSgrWorkOrderEmployeeVo">
select id, work_order_id, employee_id, dept_id, type, emp_name, start_time, end_time, valid_hours, date, month, processing_type, processing_price, processing_num, amount, helper,intime from pay_work_order_employee
</sql>
<select id="selectSgrWorkOrderEmployeeList1" resultMap="PayWorkOrderEmployeeResult">
<include refid="selectSgrWorkOrderEmployeeVo"/>
<where>
<if test="workOrderId != null "> and work_order_id = #{workOrderId}</if>
<if test="tenantId != null "> and tenant_id = #{tenantId}</if>
<if test="employeeId != null "> and employee_id = #{employeeId}</if>
<if test="deptId != null "> and dept_id = #{deptId}</if>
<if test="type != null and type != ''"> and type = #{type}</if>
<if test="empName != null and empName != ''"> and emp_name like concat('%', #{empName}, '%')</if>
<if test="startTime != null "> and start_time = #{startTime}</if>
<if test="endTime != null "> and end_time = #{endTime}</if>
<if test="validHours != null "> and valid_hours = #{validHours}</if>
<if test="date != null "> and date = #{date}</if>
<if test="month != null and month != ''"> and month = #{month}</if>
<if test="processingType != null and processingType != ''"> and processing_type = #{processingType}</if>
<if test="processingPrice != null "> and processing_price = #{processingPrice}</if>
<if test="processingNum != null "> and processing_num = #{processingNum}</if>
<if test="amount != null "> and amount = #{amount}</if>
<if test="helper != null "> and helper = #{helper}</if>
<if test="intime != null ">
<![CDATA[AND (DATE_FORMAT(`intime`, '%Y-%m') = DATE_FORMAT( #{intime}, '%Y-%m'))]]>
</if>
</where>
</select>
</mapper>
Loading…
Cancel
Save