日工工时、员工、薪资修改

master
hshansha 7 months ago
parent da9ff84197
commit 9880950b9c

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

@ -49,7 +49,7 @@ public class PayEmployeeInfoController extends BaseController {
return iPayEmployeeInfoService.queryPageList(bo, pageQuery);
}
/**
*
*
*/
@SaCheckPermission("pay:employeeInfo:list")
@GetMapping("/salesman")

@ -6,6 +6,8 @@ import java.util.concurrent.TimeUnit;
import com.ruoyi.pay.domain.PaySalaryReport;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
@ -59,9 +61,10 @@ public class PaySalaryReportController extends BaseController {
@SaCheckPermission("pay:salaryReport:export")
@Log(title = "工资明细总", businessType = BusinessType.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);
ExcelUtil.exportExcel(list, "工资明细总", PaySalaryReportVo.class, response);
iPaySalaryReportService.export(request, response, list);
}
/**

@ -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;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.converters.localdate.LocalDateDateConverter;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;
@ExcelIgnoreUnannotated
public class ExportBaohuoVo {
/** 入库时间 */
@JsonFormat(pattern = "yyyy-MM-dd")

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

@ -16,9 +16,11 @@ import java.util.List;
* @date 2025-05-12
*/
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);
@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);
PayEmployeeInfo selectSgrEmployeeInfoByIdHasDel(Long id);
}

@ -6,6 +6,8 @@ import com.ruoyi.pay.domain.bo.PaySalaryReportBo;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Collection;
import java.util.List;
@ -51,4 +53,6 @@ public interface IPaySalaryReportService {
TableDataInfo<PaySalaryReportVo> queryLastMonthReport(Long tenantId, PageQuery pageQuery);
void export(HttpServletRequest request, HttpServletResponse response, List<PaySalaryReportVo> list);
}

@ -1,6 +1,7 @@
package com.ruoyi.pay.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.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
@ -67,7 +68,7 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService {
*/
@Override
public TableDataInfo<PayDayWorkHoursVo> queryPageList2(PayDayWorkHoursBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<PayDayWorkHours> lqw = buildQueryWrapper(bo);
QueryWrapper<PayDayWorkHours> lqw = buildQueryWrapper2(bo);
Page<PayDayWorkHoursVo> result = baseMapper.selectVoPage2(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@ -81,6 +82,19 @@ public class PayDayWorkHoursServiceImpl implements IPayDayWorkHoursService {
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) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<PayDayWorkHours> lqw = Wrappers.lambdaQuery();

@ -98,6 +98,7 @@ public class PayEmployeeInfoServiceImpl implements IPayEmployeeInfoService {
lqw.eq(bo.getHtstime() != null, PayEmployeeInfo::getHtstime, bo.getHtstime());
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, 0);
return lqw;
}

@ -1,6 +1,8 @@
package com.ruoyi.pay.service.impl;
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.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
@ -8,6 +10,10 @@ import com.ruoyi.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.pay.domain.PayEmployeeInfo;
import com.ruoyi.pay.domain.vo.ButieMoneyAndTypes;
import com.ruoyi.pay.mapper.PayEmployeeInfoMapper;
import com.ruoyi.pay.util.SalaryExportUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.ruoyi.pay.domain.bo.PaySalaryReportBo;
@ -16,9 +22,11 @@ import com.ruoyi.pay.domain.PaySalaryReport;
import com.ruoyi.pay.mapper.PaySalaryReportMapper;
import com.ruoyi.pay.service.IPaySalaryReportService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* Service
@ -31,6 +39,7 @@ import java.util.Collection;
public class PaySalaryReportServiceImpl implements IPaySalaryReportService {
private final PaySalaryReportMapper baseMapper;
private final PayEmployeeInfoMapper payEmployeeInfoMapper;
/**
*
@ -158,4 +167,116 @@ public class PaySalaryReportServiceImpl implements IPaySalaryReportService {
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);
}
}

@ -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();
}
}
}

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

@ -53,12 +53,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="note != null and note != ''"> and note = #{note}</if>
</where>
</select>
<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
on d.id=c.dw_hours_id
<where>
${ew.sqlSegment}
</where>
${ew.customSqlSegment}
</select>
<select id="selectDetailById" parameterType="Long" resultMap="PayDayWorkHoursQueryResult">

@ -39,5 +39,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="remark" column="remark"/>
</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>

Loading…
Cancel
Save