feat(smartfactory): 新增工资统计功能并优化员工信息
- 新增工资统计相关接口和页面 - 添加薪资主体明细相关功能 - 优化员工信息展示和查询 - 调整工厂名称显示为简称
This commit is contained in:
parent
d8fac056a8
commit
31e12935f8
@ -26,9 +26,9 @@ import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
@ -154,7 +154,7 @@ public class StaffAttendanceRecordController {
|
||||
Map<Long, StaffDO> staffMap = convertMap(staffDOS, StaffDO::getId);
|
||||
|
||||
if (CollUtil.isNotEmpty(recordDOS)) {
|
||||
List<StaffAttendanceRecordRespVO> recordRespVO = convertRecord(reqVO, recordDOS, otherRecordDOS);
|
||||
List<StaffAttendanceRecordRespVO> recordRespVO = staffAttendanceRecordService.convertRecord(reqVO, recordDOS, otherRecordDOS);
|
||||
|
||||
// 筛选掉已经存在的员工
|
||||
List<Long> staffIds = staffDOS.stream()
|
||||
@ -215,128 +215,6 @@ public class StaffAttendanceRecordController {
|
||||
}
|
||||
}
|
||||
|
||||
private List<StaffAttendanceRecordRespVO> convertRecord(StaffAttendanceRecordReqVO reqVO,
|
||||
List<StaffAttendanceRecordDO> recordDOS,
|
||||
List<StaffAttendanceRecordDO> otherRecordDOS) {
|
||||
|
||||
// 根据考勤类型 生成对应得日期数据
|
||||
List<AttendanceRecordVO> punchTimeList = new ArrayList<>();
|
||||
|
||||
// 获取所选月份的第一天
|
||||
LocalDate now = LocalDate.parse(reqVO.getMonth() + "-01", DateTimeFormatter.ISO_LOCAL_DATE);
|
||||
if (reqVO.getType() == 1) {
|
||||
|
||||
// 获取上月26日日期
|
||||
LocalDate beginDate = now.minusMonths(1).withDayOfMonth(26);
|
||||
// 本月25日日期
|
||||
LocalDate lastMonthEnd = now.withDayOfMonth(25);
|
||||
|
||||
while (!beginDate.isAfter(lastMonthEnd)) {
|
||||
AttendanceRecordVO attendanceRecordVO = new AttendanceRecordVO()
|
||||
.setPunchTime(beginDate);
|
||||
punchTimeList.add(attendanceRecordVO);
|
||||
|
||||
beginDate = beginDate.plusDays(1);
|
||||
}
|
||||
}
|
||||
if (reqVO.getType() == 2) {
|
||||
// 获取所选月份的第一天
|
||||
LocalDate firstDayOfMonth = LocalDate.parse(reqVO.getMonth() + "-01", DateTimeFormatter.ISO_LOCAL_DATE);
|
||||
|
||||
// 生成当月每一天的 LocalDate
|
||||
for (int i = 0; i < firstDayOfMonth.lengthOfMonth(); i++) {
|
||||
AttendanceRecordVO attendanceRecordVO = new AttendanceRecordVO()
|
||||
.setPunchTime(firstDayOfMonth.plusDays(i));
|
||||
punchTimeList.add(attendanceRecordVO);
|
||||
}
|
||||
}
|
||||
// 获取员工信息
|
||||
List<StaffDO> staffDOS = staffService.getList(convertSet(recordDOS, StaffAttendanceRecordDO::getStaffId));
|
||||
Map<Long, StaffDO> staffMap = convertMap(staffDOS, StaffDO::getId);
|
||||
|
||||
// 获取厂区信息
|
||||
Set<Long> factoryIds = convertSet(recordDOS, StaffAttendanceRecordDO::getFactoryId);
|
||||
factoryIds.addAll(convertList(otherRecordDOS, StaffAttendanceRecordDO::getFactoryId));
|
||||
List<FactoryInfoDO> factoryDOS = factoryInfoService.getFactoryList(factoryIds);
|
||||
Map<Long, FactoryInfoDO> factoryMap = convertMap(factoryDOS, FactoryInfoDO::getId);
|
||||
|
||||
// 根据用户 分组打卡记录
|
||||
Map<Long, List<StaffAttendanceRecordDO>> recordMap = convertMultiMap(recordDOS, StaffAttendanceRecordDO::getStaffId);
|
||||
|
||||
// 重组数据
|
||||
List<StaffAttendanceRecordRespVO> respVOs = new ArrayList<>();
|
||||
for (Map.Entry<Long, List<StaffAttendanceRecordDO>> entry : recordMap.entrySet()) {
|
||||
|
||||
if (!staffMap.containsKey(entry.getKey())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 设置所选厂区 员工得考勤信息
|
||||
StaffAttendanceRecordRespVO respVO = new StaffAttendanceRecordRespVO(
|
||||
entry.getKey(),
|
||||
reqVO.getFactoryId(),
|
||||
reqVO.getType(),
|
||||
reqVO.getMonth());
|
||||
|
||||
Map<LocalDate, AttendanceRecordVO> records = entry.getValue().stream()
|
||||
.filter(record -> record.getFactoryId().equals(reqVO.getFactoryId())) // 筛选同一个工厂打卡数据
|
||||
.map(item -> BeanUtils.toBean(item, AttendanceRecordVO.class))
|
||||
.collect(Collectors.toMap(AttendanceRecordVO::getPunchTime, value -> value));
|
||||
// 设置打卡数据
|
||||
respVO.setRecords(punchTimeList.stream()
|
||||
.peek(record -> {
|
||||
if (records.containsKey(record.getPunchTime())) {
|
||||
record.setStatus(records.get(record.getPunchTime()).getStatus());
|
||||
}})
|
||||
.collect(Collectors.toList()));
|
||||
// 设置员工名称
|
||||
respVO.setStaffName(staffMap.get(entry.getKey()).getNickName());
|
||||
// 设置工种
|
||||
respVO.setWorkTypeId(staffMap.get(entry.getKey()).getWorkTypeId());
|
||||
// 设置厂区名称
|
||||
respVO.setFactoryName(factoryMap.get(reqVO.getFactoryId()) != null ? factoryMap.get(reqVO.getFactoryId()).getName() : null);
|
||||
|
||||
if (CollUtil.isNotEmpty(otherRecordDOS)) {
|
||||
// 获得该员工 在其他工厂的考勤记录
|
||||
Map<Long, List<StaffAttendanceRecordDO>> factoryRecordMap = convertMultiMap(otherRecordDOS, StaffAttendanceRecordDO::getFactoryId);
|
||||
|
||||
List<StaffAttendanceRecordRespVO> childRespVO = otherRecordDOS.stream()
|
||||
.map(recordDO -> new StaffAttendanceRecordRespVO(
|
||||
recordDO.getStaffId(),
|
||||
recordDO.getFactoryId(),
|
||||
recordDO.getType(),
|
||||
recordDO.getMonth()))
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
|
||||
childRespVO.forEach(vo -> {
|
||||
if (!staffMap.containsKey(vo.getStaffId())) {
|
||||
return;
|
||||
}
|
||||
// 设置员工名称
|
||||
vo.setStaffName(staffMap.get(vo.getStaffId()).getNickName());
|
||||
// 设置工种
|
||||
vo.setWorkTypeId(staffMap.get(vo.getStaffId()).getWorkTypeId());
|
||||
// 设置厂区名称
|
||||
vo.setFactoryName(factoryMap.get(vo.getFactoryId()) != null ? factoryMap.get(vo.getFactoryId()).getName() : null);
|
||||
|
||||
if (factoryRecordMap.containsKey(vo.getFactoryId())) {
|
||||
|
||||
// 设置打卡记录
|
||||
vo.setRecords(BeanUtils.toBean(factoryRecordMap.get(vo.getFactoryId()), AttendanceRecordVO.class));
|
||||
}
|
||||
});
|
||||
// 插入其他考勤记录
|
||||
respVO.setChildRecords(childRespVO);
|
||||
}
|
||||
|
||||
// 插入集合
|
||||
respVOs.add(respVO);
|
||||
}
|
||||
|
||||
return respVOs;
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@Operation(summary = "导出厂区员工考勤记录 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('smartfactory:staff-attendance-record:export')")
|
||||
@ -347,7 +225,7 @@ public class StaffAttendanceRecordController {
|
||||
List<StaffAttendanceRecordDO> recordDOS = staffAttendanceRecordService.getStaffAttendanceRecordList(reqVO);
|
||||
// 导出 Excel
|
||||
ExcelUtils.write(response, "厂区员工考勤记录.xls", "数据", StaffAttendanceRecordRespVO.class,
|
||||
convertRecord(reqVO, recordDOS, null));
|
||||
staffAttendanceRecordService.convertRecord(reqVO, recordDOS, null));
|
||||
}
|
||||
|
||||
@PutMapping("/review")
|
||||
|
@ -1,5 +1,6 @@
|
||||
package cn.iocoder.yudao.module.smartfactory.controller.admin.handlinggroupamountspecifications;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
@ -12,6 +13,8 @@ import cn.iocoder.yudao.module.smartfactory.controller.admin.handlinggroupamount
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.handlinggroupamountspecifications.vo.HandlingGroupAmountSpecificationsSaveReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.handlinggroupamountspecifications.HandlingGroupAmountSpecificationsDO;
|
||||
import cn.iocoder.yudao.module.smartfactory.service.handlinggroupamountspecifications.HandlingGroupAmountSpecificationsService;
|
||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@ -24,8 +27,12 @@ import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
||||
|
||||
@Tag(name = "管理后台 - 搬运组工资规格关联")
|
||||
@ -37,6 +44,9 @@ public class HandlingGroupAmountSpecificationsController {
|
||||
@Resource
|
||||
private HandlingGroupAmountSpecificationsService handlingGroupAmountSpecificationsService;
|
||||
|
||||
@Resource
|
||||
private DeptApi deptApi;
|
||||
|
||||
@PostMapping("/batchCreate")
|
||||
@Operation(summary = "创建搬运组工资规格关联")
|
||||
@PreAuthorize("@ss.hasPermission('smartfactory:handling-group-amount-specifications:create')")
|
||||
@ -77,7 +87,20 @@ public class HandlingGroupAmountSpecificationsController {
|
||||
@PreAuthorize("@ss.hasPermission('smartfactory:handling-group-amount-specifications:query')")
|
||||
public CommonResult<PageResult<HandlingGroupAmountSpecificationsRespVO>> getHandlingGroupAmountSpecificationsPage(@Valid HandlingGroupAmountSpecificationsPageReqVO pageReqVO) {
|
||||
PageResult<HandlingGroupAmountSpecificationsDO> pageResult = handlingGroupAmountSpecificationsService.getHandlingGroupAmountSpecificationsPage(pageReqVO);
|
||||
return success(BeanUtils.toBean(pageResult, HandlingGroupAmountSpecificationsRespVO.class));
|
||||
PageResult<HandlingGroupAmountSpecificationsRespVO> result = BeanUtils.toBean(pageResult, HandlingGroupAmountSpecificationsRespVO.class);
|
||||
if (CollUtil.isNotEmpty(result.getList())) {
|
||||
|
||||
// 获取工厂信息
|
||||
Set<Long> factoryIds = convertSet(result.getList(), HandlingGroupAmountSpecificationsRespVO::getFactoryId);
|
||||
Map<Long, DeptRespDTO> factoryMap = convertMap(deptApi.getDeptList(factoryIds).getCheckedData(), DeptRespDTO::getId);
|
||||
|
||||
result.getList().forEach(data -> {
|
||||
// 设置工厂名称
|
||||
data.setFactoryName(factoryMap.get(data.getFactoryId()) != null ? factoryMap.get(data.getFactoryId()).getName() : null);
|
||||
});
|
||||
}
|
||||
|
||||
return success(result);
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
|
@ -20,6 +20,9 @@ public class HandlingGroupAmountSpecificationsRespVO {
|
||||
@Schema(description = "工厂id", example = "23178")
|
||||
private Long factoryId;
|
||||
|
||||
@Schema(description = "工厂名称", example = "23178")
|
||||
private String factoryName;
|
||||
|
||||
@Schema(description = "搬运规格id", example = "23178")
|
||||
@ExcelProperty("搬运规格id")
|
||||
private Long handlingSpecificationsId;
|
||||
|
@ -74,6 +74,14 @@ public class StaffController {
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@PutMapping("/update-salary")
|
||||
@Operation(summary = "更新员工")
|
||||
@PreAuthorize("@ss.hasPermission('factory:staff:update')")
|
||||
public CommonResult<Boolean> updateStaffSalary(@RequestBody StaffSalaryUpdateVO updateReqVO) {
|
||||
staffService.updateStaffSalary(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除员工")
|
||||
@Parameter(name = "id", description = "编号", required = true)
|
||||
|
@ -49,9 +49,21 @@ public class StaffRespVO {
|
||||
@ExcelProperty("身份证号")
|
||||
private String idCard;
|
||||
|
||||
@Schema(description = "银行卡名称")
|
||||
private String bankName;
|
||||
|
||||
@Schema(description = "银行卡号")
|
||||
private String bankNo;
|
||||
|
||||
@Schema(description = "薪资主体 | 字典值 sf_staff_salary_subject")
|
||||
private Integer salarySubject;
|
||||
|
||||
@Schema(description = "0离职 1在职 2工伤")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "备注")
|
||||
private String notes;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private LocalDateTime createTime;
|
||||
|
||||
|
@ -0,0 +1,20 @@
|
||||
package cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
@Schema(description = "管理后台 - 员工更新 Request VO")
|
||||
@Data
|
||||
public class StaffSalaryUpdateVO {
|
||||
|
||||
@Schema(description = "主键id")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "薪资")
|
||||
private BigDecimal salary;
|
||||
|
||||
@Schema(description = "薪资主体 | 字典值 sf_staff_salary_subject")
|
||||
private Integer salarySubject;
|
||||
}
|
@ -43,9 +43,21 @@ public class StaffSaveReqVO {
|
||||
@IdCard
|
||||
private String idCard;
|
||||
|
||||
@Schema(description = "银行卡名称")
|
||||
private String bankName;
|
||||
|
||||
@Schema(description = "银行卡号")
|
||||
private String bankNo;
|
||||
|
||||
@Schema(description = "薪资")
|
||||
private BigDecimal salary;
|
||||
|
||||
@Schema(description = "薪资主体 | 字典值 sf_staff_salary_subject")
|
||||
private Integer salarySubject;
|
||||
|
||||
@Schema(description = "备注")
|
||||
private String notes;
|
||||
|
||||
@Schema(description = "0离职 1在职 2工伤")
|
||||
private Integer status;
|
||||
|
||||
|
@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.SalaryTotalVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.StaffSalaryPageReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.StaffSalaryRespVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.StaffSalarySaveReqVO;
|
||||
@ -86,6 +87,14 @@ public class StaffSalaryController {
|
||||
return success(pageResult);
|
||||
}
|
||||
|
||||
@GetMapping("/total")
|
||||
@Operation(summary = "获取工资统计")
|
||||
@PreAuthorize("@ss.hasPermission('smartfactory:staff-salary:query')")
|
||||
public CommonResult<SalaryTotalVO> getStaffSalaryTotal(@Valid StaffSalaryPageReqVO pageReqVO) {
|
||||
|
||||
return success(staffSalaryService.getStaffSalaryTotal(pageReqVO));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@Operation(summary = "导出厂区员工工资 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('smartfactory:staff-salary:export')")
|
||||
|
@ -0,0 +1,17 @@
|
||||
package cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
@Schema(description = "管理后台 - 薪资主体明细 Response VO")
|
||||
@Data
|
||||
public class SalarySubjectItemsVO {
|
||||
|
||||
@Schema(description = "薪资主体编号")
|
||||
private Integer salarySubjectId;
|
||||
|
||||
@Schema(description = "金额")
|
||||
private BigDecimal amount;
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
@Schema(description = "管理后台 - 薪资统计信息 Response VO")
|
||||
@Data
|
||||
public class SalaryTotalVO {
|
||||
|
||||
@Schema(description = "实发金额总计")
|
||||
private BigDecimal realAmountTotal;
|
||||
|
||||
@Schema(description = "薪资主体明细总计")
|
||||
private List<SalarySubjectItemsVO> salarySubjectItems;
|
||||
}
|
@ -66,6 +66,9 @@ public class StaffSalaryRespVO {
|
||||
@Schema(description = "扣款明细")
|
||||
private List<DeductionItemsVO> deductionItems;
|
||||
|
||||
@Schema(description = "薪资主体明细")
|
||||
private List<SalarySubjectItemsVO> salarySubjectItems;
|
||||
|
||||
@Schema(description = "复核状态 | 0未复核 1已复核")
|
||||
private Integer status;
|
||||
|
||||
|
@ -45,6 +45,9 @@ public class StaffSalarySaveReqVO {
|
||||
@Schema(description = "扣款明细")
|
||||
private List<DeductionItemsVO> deductionItems;
|
||||
|
||||
@Schema(description = "薪资主体明细")
|
||||
private List<SalarySubjectItemsVO> salarySubjectItems;
|
||||
|
||||
@Schema(description = "复核状态 | 0未复核 1已复核", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "0")
|
||||
private Integer status;
|
||||
|
||||
|
@ -68,11 +68,31 @@ public class StaffDO extends BaseDO {
|
||||
*/
|
||||
private String idCard;
|
||||
|
||||
/**
|
||||
* 银行名称
|
||||
*/
|
||||
private String bankName;
|
||||
|
||||
/**
|
||||
* 银行卡号
|
||||
*/
|
||||
private String bankNo;
|
||||
|
||||
/**
|
||||
* 工资
|
||||
*/
|
||||
private BigDecimal salary;
|
||||
|
||||
/**
|
||||
* 薪资主体 | 字典值 sf_staff_salary_subject
|
||||
*/
|
||||
private Integer salarySubject;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String notes;
|
||||
|
||||
/**
|
||||
* 0离职 1在职 2工伤
|
||||
*/
|
||||
|
@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.smartfactory.dal.dataobject.staffsalary;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.DeductionItemsVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.SalarySubjectItemsVO;
|
||||
import com.baomidou.mybatisplus.annotation.KeySequence;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
@ -69,6 +70,11 @@ public class StaffSalaryDO extends BaseDO {
|
||||
*/
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private List<DeductionItemsVO> deductionItems;
|
||||
/**
|
||||
* 薪资主体明细
|
||||
*/
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private List<SalarySubjectItemsVO> salarySubjectItems;
|
||||
/**
|
||||
* 复核状态 | 0未复核 1已复核
|
||||
*/
|
||||
|
@ -54,7 +54,7 @@ public interface StaffMapper extends BaseMapperX<StaffDO> {
|
||||
.selectAs(StaffDO::getId, StaffSalaryRespVO::getStaffId)
|
||||
.selectAs(StaffDO::getNickName, StaffSalaryRespVO::getStaffName)
|
||||
.selectAs(StaffDO::getFactoryId, StaffSalaryRespVO::getFactoryId)
|
||||
.selectAs(FactoryInfoDO::getName, StaffSalaryRespVO::getFactoryName)
|
||||
.selectAs(FactoryInfoDO::getShortName, StaffSalaryRespVO::getFactoryName)
|
||||
.selectAs(StaffDO::getWorkTypeId, StaffSalaryRespVO::getWorkTypeId)
|
||||
.selectAs(StaffSalaryDO::getMonth, StaffSalaryRespVO::getMonth)
|
||||
.selectAs(StaffDO::getSalary, StaffSalaryRespVO::getSalary)
|
||||
|
@ -3,13 +3,17 @@ package cn.iocoder.yudao.module.smartfactory.dal.mysql.staffsalary;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.SalarySubjectItemsVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.SalaryTotalVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.StaffSalaryPageReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.StaffSalaryRespVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staff.StaffDO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staffsalary.StaffSalaryDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
@ -26,7 +30,7 @@ public interface StaffSalaryMapper extends BaseMapperX<StaffSalaryDO> {
|
||||
.selectAll(StaffSalaryDO.class)
|
||||
.selectAs(StaffDO::getNickName, StaffSalaryRespVO::getStaffName)
|
||||
.selectAs(StaffDO::getWorkTypeId, StaffSalaryRespVO::getWorkTypeId)
|
||||
.selectAs(FactoryInfoDO::getName, StaffSalaryRespVO::getFactoryName)
|
||||
.selectAs(FactoryInfoDO::getShortName, StaffSalaryRespVO::getFactoryName)
|
||||
.selectAs(StaffDO::getSalary, StaffSalaryRespVO::getSalary);
|
||||
|
||||
query.leftJoin(StaffDO.class, "staff", StaffDO::getId, StaffSalaryDO::getStaffId);
|
||||
@ -39,4 +43,8 @@ public interface StaffSalaryMapper extends BaseMapperX<StaffSalaryDO> {
|
||||
|
||||
return selectJoinPage(reqVO, StaffSalaryRespVO.class, query);
|
||||
}
|
||||
|
||||
SalaryTotalVO selectSalaryTotal(@Param("pageReqVO") StaffSalaryPageReqVO pageReqVO);
|
||||
|
||||
List<SalarySubjectItemsVO> selectListSalarySubjectItems(@Param("pageReqVO") StaffSalaryPageReqVO pageReqVO);
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
package cn.iocoder.yudao.module.smartfactory.service.attendance;
|
||||
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.attendance.vo.StaffAttendanceRecordReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.attendance.vo.StaffAttendanceRecordRespVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.attendance.vo.StaffAttendanceRecordSaveReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.attendance.StaffAttendanceRecordDO;
|
||||
|
||||
@ -88,4 +89,8 @@ public interface StaffAttendanceRecordService {
|
||||
* @return 是否已审核
|
||||
*/
|
||||
Integer getIsReview(Long factoryId, String month);
|
||||
|
||||
List<StaffAttendanceRecordRespVO> convertRecord(StaffAttendanceRecordReqVO reqVO,
|
||||
List<StaffAttendanceRecordDO> recordDOS,
|
||||
List<StaffAttendanceRecordDO> otherRecordDOS);
|
||||
}
|
@ -3,16 +3,19 @@ package cn.iocoder.yudao.module.smartfactory.service.attendance;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.attendance.vo.AttendanceRecordVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.attendance.vo.StaffAttendanceRecordReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.attendance.vo.StaffAttendanceRecordRespVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.attendance.vo.StaffAttendanceRecordSaveReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.attendance.SfAttendanceReviewDO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.attendance.StaffAttendanceRecordDO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staff.StaffDO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.mysql.attendance.SfAttendanceReviewMapper;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.mysql.attendance.StaffAttendanceRecordMapper;
|
||||
import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService;
|
||||
import cn.iocoder.yudao.module.smartfactory.service.staff.StaffService;
|
||||
import cn.iocoder.yudao.module.smartfactory.service.staffsalary.StaffSalaryService;
|
||||
import cn.iocoder.yudao.module.smartfactory.framework.job.staffSalary.StaffSalaryJob;
|
||||
import cn.iocoder.yudao.module.smartfactory.service.staffsalary.StaffSalaryService;
|
||||
import org.springframework.data.redis.connection.stream.ObjectRecord;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
@ -21,9 +24,12 @@ import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
|
||||
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.STAFF_ATTENDANCE_RECORD_NOT_EXISTS;
|
||||
|
||||
/**
|
||||
@ -44,6 +50,12 @@ public class StaffAttendanceRecordServiceImpl implements StaffAttendanceRecordSe
|
||||
@Resource
|
||||
private SfAttendanceReviewMapper attendanceReviewMapper;
|
||||
|
||||
@Resource
|
||||
private StaffService staffService;
|
||||
|
||||
@Resource
|
||||
private FactoryInfoService factoryInfoService;
|
||||
|
||||
@Override
|
||||
public void createStaffAttendanceRecord(List<StaffAttendanceRecordSaveReqVO> createReqVO) {
|
||||
|
||||
@ -56,8 +68,7 @@ public class StaffAttendanceRecordServiceImpl implements StaffAttendanceRecordSe
|
||||
List<StaffAttendanceRecordDO> createDo = new ArrayList<>();
|
||||
for (StaffAttendanceRecordSaveReqVO vo : createReqVO) {
|
||||
|
||||
List<StaffAttendanceRecordDO> staffAttendanceRecord = new ArrayList<>();
|
||||
staffAttendanceRecord = BeanUtils.toBean(vo.getRecords(), StaffAttendanceRecordDO.class);
|
||||
List<StaffAttendanceRecordDO> staffAttendanceRecord = BeanUtils.toBean(vo.getRecords(), StaffAttendanceRecordDO.class);
|
||||
// 移除status为空得数据
|
||||
staffAttendanceRecord.removeIf(item -> item.getStatus() == null);
|
||||
|
||||
@ -200,4 +211,129 @@ public class StaffAttendanceRecordServiceImpl implements StaffAttendanceRecordSe
|
||||
.eq(SfAttendanceReviewDO::getMonth, month));
|
||||
return attendanceReviewDO != null ? attendanceReviewDO.getStatus() : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<StaffAttendanceRecordRespVO> convertRecord(StaffAttendanceRecordReqVO reqVO,
|
||||
List<StaffAttendanceRecordDO> recordDOS,
|
||||
List<StaffAttendanceRecordDO> otherRecordDOS) {
|
||||
// 根据考勤类型 生成对应得日期数据
|
||||
List<AttendanceRecordVO> punchTimeList = new ArrayList<>();
|
||||
|
||||
// 获取所选月份的第一天
|
||||
LocalDate now = LocalDate.parse(reqVO.getMonth() + "-01", DateTimeFormatter.ISO_LOCAL_DATE);
|
||||
if (reqVO.getType() == 1) {
|
||||
|
||||
// 获取上月26日日期
|
||||
LocalDate beginDate = now.minusMonths(1).withDayOfMonth(26);
|
||||
// 本月25日日期
|
||||
LocalDate lastMonthEnd = now.withDayOfMonth(25);
|
||||
|
||||
while (!beginDate.isAfter(lastMonthEnd)) {
|
||||
AttendanceRecordVO attendanceRecordVO = new AttendanceRecordVO()
|
||||
.setPunchTime(beginDate);
|
||||
punchTimeList.add(attendanceRecordVO);
|
||||
|
||||
beginDate = beginDate.plusDays(1);
|
||||
}
|
||||
}
|
||||
if (reqVO.getType() == 2) {
|
||||
// 获取所选月份的第一天
|
||||
LocalDate firstDayOfMonth = LocalDate.parse(reqVO.getMonth() + "-01", DateTimeFormatter.ISO_LOCAL_DATE);
|
||||
|
||||
// 生成当月每一天的 LocalDate
|
||||
for (int i = 0; i < firstDayOfMonth.lengthOfMonth(); i++) {
|
||||
AttendanceRecordVO attendanceRecordVO = new AttendanceRecordVO()
|
||||
.setPunchTime(firstDayOfMonth.plusDays(i));
|
||||
punchTimeList.add(attendanceRecordVO);
|
||||
}
|
||||
}
|
||||
// 获取员工信息
|
||||
List<StaffDO> staffDOS = staffService.getList(convertSet(recordDOS, StaffAttendanceRecordDO::getStaffId));
|
||||
Map<Long, StaffDO> staffMap = convertMap(staffDOS, StaffDO::getId);
|
||||
|
||||
// 获取厂区信息
|
||||
Set<Long> factoryIds = convertSet(recordDOS, StaffAttendanceRecordDO::getFactoryId);
|
||||
factoryIds.addAll(convertList(otherRecordDOS, StaffAttendanceRecordDO::getFactoryId));
|
||||
List<FactoryInfoDO> factoryDOS = factoryInfoService.getFactoryList(factoryIds);
|
||||
Map<Long, FactoryInfoDO> factoryMap = convertMap(factoryDOS, FactoryInfoDO::getId);
|
||||
|
||||
// 根据用户 分组打卡记录
|
||||
Map<Long, List<StaffAttendanceRecordDO>> recordMap = convertMultiMap(recordDOS, StaffAttendanceRecordDO::getStaffId);
|
||||
|
||||
// 重组数据
|
||||
List<StaffAttendanceRecordRespVO> respVOs = new ArrayList<>();
|
||||
for (Map.Entry<Long, List<StaffAttendanceRecordDO>> entry : recordMap.entrySet()) {
|
||||
|
||||
if (!staffMap.containsKey(entry.getKey())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 设置所选厂区 员工得考勤信息
|
||||
StaffAttendanceRecordRespVO respVO = new StaffAttendanceRecordRespVO(
|
||||
entry.getKey(),
|
||||
reqVO.getFactoryId(),
|
||||
reqVO.getType(),
|
||||
reqVO.getMonth());
|
||||
|
||||
Map<LocalDate, AttendanceRecordVO> records = entry.getValue().stream()
|
||||
.filter(record -> record.getFactoryId().equals(reqVO.getFactoryId())) // 筛选同一个工厂打卡数据
|
||||
.map(item -> BeanUtils.toBean(item, AttendanceRecordVO.class))
|
||||
.collect(Collectors.toMap(AttendanceRecordVO::getPunchTime, value -> value));
|
||||
// 设置打卡数据
|
||||
List<AttendanceRecordVO> recordVOS = punchTimeList.stream()
|
||||
.map(record -> {
|
||||
AttendanceRecordVO recordVO = BeanUtils.toBean(record, AttendanceRecordVO.class);
|
||||
if (records.containsKey(record.getPunchTime())) {
|
||||
recordVO.setStatus(records.get(record.getPunchTime()).getStatus());
|
||||
}
|
||||
return recordVO;
|
||||
}).collect(Collectors.toList());
|
||||
respVO.setRecords(recordVOS);
|
||||
// 设置员工名称
|
||||
respVO.setStaffName(staffMap.get(entry.getKey()).getNickName());
|
||||
// 设置工种
|
||||
respVO.setWorkTypeId(staffMap.get(entry.getKey()).getWorkTypeId());
|
||||
// 设置厂区名称
|
||||
respVO.setFactoryName(factoryMap.get(reqVO.getFactoryId()) != null ? factoryMap.get(reqVO.getFactoryId()).getName() : null);
|
||||
|
||||
if (CollUtil.isNotEmpty(otherRecordDOS)) {
|
||||
// 获得该员工 在其他工厂的考勤记录
|
||||
Map<Long, List<StaffAttendanceRecordDO>> factoryRecordMap = convertMultiMap(otherRecordDOS, StaffAttendanceRecordDO::getFactoryId);
|
||||
|
||||
List<StaffAttendanceRecordRespVO> childRespVO = otherRecordDOS.stream()
|
||||
.map(recordDO -> new StaffAttendanceRecordRespVO(
|
||||
recordDO.getStaffId(),
|
||||
recordDO.getFactoryId(),
|
||||
recordDO.getType(),
|
||||
recordDO.getMonth()))
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
|
||||
childRespVO.forEach(vo -> {
|
||||
if (!staffMap.containsKey(vo.getStaffId())) {
|
||||
return;
|
||||
}
|
||||
// 设置员工名称
|
||||
vo.setStaffName(staffMap.get(vo.getStaffId()).getNickName());
|
||||
// 设置工种
|
||||
vo.setWorkTypeId(staffMap.get(vo.getStaffId()).getWorkTypeId());
|
||||
// 设置厂区名称
|
||||
vo.setFactoryName(factoryMap.get(vo.getFactoryId()) != null ? factoryMap.get(vo.getFactoryId()).getName() : null);
|
||||
|
||||
if (factoryRecordMap.containsKey(vo.getFactoryId())) {
|
||||
|
||||
// 设置打卡记录
|
||||
vo.setRecords(BeanUtils.toBean(factoryRecordMap.get(vo.getFactoryId()), AttendanceRecordVO.class));
|
||||
}
|
||||
});
|
||||
// 插入其他考勤记录
|
||||
respVO.setChildRecords(childRespVO);
|
||||
}
|
||||
|
||||
// 插入集合
|
||||
respVOs.add(respVO);
|
||||
}
|
||||
|
||||
return respVOs;
|
||||
}
|
||||
}
|
@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.smartfactory.service.staff;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.vo.StaffDataRespVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffImportExcelVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffImportRespVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffPageReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffSaveReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.*;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staff.StaffDO;
|
||||
|
||||
import javax.validation.Valid;
|
||||
@ -132,4 +129,10 @@ public interface StaffService {
|
||||
* @return 员工信息
|
||||
*/
|
||||
StaffDO getStaffByUserId(Long userId);
|
||||
|
||||
/**
|
||||
* 更新员工工资
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
void updateStaffSalary(StaffSalaryUpdateVO updateReqVO);
|
||||
}
|
||||
|
@ -11,10 +11,7 @@ import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.screendata.factory.vo.StaffDataRespVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffImportExcelVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffImportRespVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffPageReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.StaffSaveReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staff.vo.*;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staff.StaffDO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.mysql.staff.StaffMapper;
|
||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||
@ -288,4 +285,16 @@ public class StaffServiceImpl implements StaffService {
|
||||
|
||||
return staffMapper.selectStaffByUserId(userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateStaffSalary(StaffSalaryUpdateVO updateReqVO) {
|
||||
|
||||
if (staffMapper.selectById(updateReqVO.getId()) == null) {
|
||||
throw exception(STAFF_NOT_EXISTS);
|
||||
}
|
||||
|
||||
// 更新
|
||||
StaffDO updateObj = BeanUtils.toBean(updateReqVO, StaffDO.class);
|
||||
staffMapper.updateById(updateObj);
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package cn.iocoder.yudao.module.smartfactory.service.staffsalary;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.SalaryTotalVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.StaffSalaryPageReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.StaffSalaryRespVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.StaffSalarySaveReqVO;
|
||||
@ -65,4 +66,11 @@ public interface StaffSalaryService {
|
||||
* @param vo 考勤信息
|
||||
*/
|
||||
void calculateSalary(List<StaffAttendanceRecordDO> vo);
|
||||
|
||||
/**
|
||||
* 获取工资统计
|
||||
* @param pageReqVO 查询信息
|
||||
* @return 统计信息
|
||||
*/
|
||||
SalaryTotalVO getStaffSalaryTotal(StaffSalaryPageReqVO pageReqVO);
|
||||
}
|
@ -6,9 +6,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.module.bpm.api.oa.BpmOALoanApi;
|
||||
import cn.iocoder.yudao.module.bpm.api.oa.vo.loan.BpmOALoanSumDTO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.StaffSalaryPageReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.StaffSalaryRespVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.StaffSalarySaveReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.*;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.attendance.StaffAttendanceRecordDO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staff.StaffDO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staffsalary.StaffSalaryDO;
|
||||
@ -26,10 +24,7 @@ import java.math.RoundingMode;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
@ -193,6 +188,10 @@ public class StaffSalaryServiceImpl implements StaffSalaryService {
|
||||
List<StaffSalaryDO> salaryDOS = new ArrayList<>();
|
||||
for (Map.Entry<Long, List<StaffAttendanceRecordDO>> entry : recordMap.entrySet()) {
|
||||
Long staffId = entry.getKey();
|
||||
StaffDO staffDO = staffMap.get(staffId);
|
||||
if (staffDO == null) {
|
||||
continue;
|
||||
}
|
||||
// 获取该员工的上班考勤记录
|
||||
List<StaffAttendanceRecordDO> items = entry.getValue().stream()
|
||||
.filter(item -> item.getStatus() == 1)
|
||||
@ -211,21 +210,38 @@ public class StaffSalaryServiceImpl implements StaffSalaryService {
|
||||
long days = ChronoUnit.DAYS.between(date[0], date[1]);
|
||||
int workDays = (int) days + 1;
|
||||
|
||||
// 设置扣款明细 默认扣除保险 50元
|
||||
salaryDO.setDeductionItems(Collections.singletonList(
|
||||
new DeductionItemsVO()
|
||||
.setKey("insurance")
|
||||
.setValue("50")
|
||||
));
|
||||
|
||||
// 计算应发工资
|
||||
if (staffMap.get(staffId).getSalary() != null) { // 没有录入基本薪资时,不做计算
|
||||
BigDecimal salary = staffDO.getSalary();
|
||||
if (salary != null) { // 没有录入基本薪资时,不做计算
|
||||
|
||||
if (salaryDO.getAttendanceDays() == workDays) {
|
||||
// 设置应发工资
|
||||
salaryDO.setPayableAmount(staffMap.get(staffId).getSalary());
|
||||
salaryDO.setPayableAmount(salary);
|
||||
// 设置实发工资
|
||||
salaryDO.setRealAmount(staffMap.get(staffId).getSalary());
|
||||
salaryDO.setRealAmount(salary.subtract(BigDecimal.valueOf(50)));
|
||||
} else {
|
||||
BigDecimal payableAmount = staffMap.get(staffId).getSalary().divide(BigDecimal.valueOf(workDays), RoundingMode.HALF_UP)
|
||||
BigDecimal payableAmount = salary.divide(BigDecimal.valueOf(workDays), 0, RoundingMode.DOWN)
|
||||
.multiply(BigDecimal.valueOf(salaryDO.getAttendanceDays()));
|
||||
// 设置应发工资
|
||||
salaryDO.setPayableAmount(payableAmount);
|
||||
// 设置实发工资
|
||||
salaryDO.setRealAmount(payableAmount);
|
||||
salaryDO.setRealAmount(payableAmount.subtract(BigDecimal.valueOf(50)));
|
||||
}
|
||||
|
||||
// 设置薪资主体数据
|
||||
if (staffDO.getSalarySubject() != null) {
|
||||
salaryDO.setSalarySubjectItems(Collections.singletonList(
|
||||
new SalarySubjectItemsVO()
|
||||
.setSalarySubjectId(staffDO.getSalarySubject())
|
||||
.setAmount(salaryDO.getPayableAmount())
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@ -236,4 +252,28 @@ public class StaffSalaryServiceImpl implements StaffSalaryService {
|
||||
// 插入工资记录
|
||||
staffSalaryMapper.insertBatch(salaryDOS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SalaryTotalVO getStaffSalaryTotal(StaffSalaryPageReqVO pageReqVO) {
|
||||
|
||||
// 获取实发工资的合计
|
||||
SalaryTotalVO salaryTotalVO = staffSalaryMapper.selectSalaryTotal(pageReqVO);
|
||||
|
||||
// 获取主体薪资的合计
|
||||
List<SalarySubjectItemsVO> salarySubjectItemsVO = staffSalaryMapper.selectListSalarySubjectItems(pageReqVO);
|
||||
Map<Integer, SalarySubjectItemsVO> sumMap = salarySubjectItemsVO.stream()
|
||||
.collect(Collectors.toMap(
|
||||
SalarySubjectItemsVO::getSalarySubjectId,
|
||||
vo -> new SalarySubjectItemsVO()
|
||||
.setSalarySubjectId(vo.getSalarySubjectId())
|
||||
.setAmount(vo.getAmount()),
|
||||
(vo1, vo2) -> {
|
||||
vo1.setAmount(vo1.getAmount().add(vo2.getAmount()));
|
||||
return vo1;
|
||||
}
|
||||
));
|
||||
salaryTotalVO.setSalarySubjectItems(new ArrayList<>(sumMap.values()));
|
||||
|
||||
return salaryTotalVO;
|
||||
}
|
||||
}
|
@ -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="cn.iocoder.yudao.module.smartfactory.dal.mysql.staffsalary.StaffSalaryMapper">
|
||||
|
||||
<!--
|
||||
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
|
||||
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
|
||||
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
|
||||
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
|
||||
-->
|
||||
|
||||
|
||||
<select id="selectSalaryTotal" resultType="cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.SalaryTotalVO">
|
||||
SELECT
|
||||
SUM(a.real_amount) AS realAmountTotal
|
||||
FROM
|
||||
sf_staff_salary a
|
||||
LEFT JOIN sf_staff b ON b.id = a.staff_id
|
||||
WHERE
|
||||
a.deleted = 0
|
||||
<if test="pageReqVO.factoryId != null">
|
||||
AND a.factory_id = #{pageReqVO.factoryId}
|
||||
</if>
|
||||
<if test="pageReqVO.month != null">
|
||||
AND a.month = #{pageReqVO.month}
|
||||
</if>
|
||||
<if test="pageReqVO.status != null">
|
||||
AND a.status = #{pageReqVO.status}
|
||||
</if>
|
||||
<if test="pageReqVO.workTypeId != null">
|
||||
AND b.work_type_id = #{pageReqVO.workTypeId}
|
||||
</if>
|
||||
</select>
|
||||
<select id="selectListSalarySubjectItems" resultType="cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.SalarySubjectItemsVO">
|
||||
SELECT
|
||||
a.salary_subject_items
|
||||
FROM
|
||||
sf_staff_salary a
|
||||
LEFT JOIN sf_staff b ON b.id = a.staff_id
|
||||
WHERE
|
||||
a.deleted = 0
|
||||
<if test="pageReqVO.factoryId != null">
|
||||
AND a.factory_id = #{pageReqVO.factoryId}
|
||||
</if>
|
||||
<if test="pageReqVO.month != null">
|
||||
AND a.month = #{pageReqVO.month}
|
||||
</if>
|
||||
<if test="pageReqVO.status != null">
|
||||
AND a.status = #{pageReqVO.status}
|
||||
</if>
|
||||
<if test="pageReqVO.workTypeId != null">
|
||||
AND b.work_type_id = #{pageReqVO.workTypeId}
|
||||
</if>
|
||||
</select>
|
||||
</mapper>
|
Loading…
Reference in New Issue
Block a user