diff --git a/src/com/api/salary/web/DzSalaryReportController.java b/src/com/api/salary/web/DzSalaryReportController.java new file mode 100644 index 000000000..129337b0b --- /dev/null +++ b/src/com/api/salary/web/DzSalaryReportController.java @@ -0,0 +1,12 @@ +package com.api.salary.web; + +import javax.ws.rs.Path; + +/** + * @author:dxfeng + * @createTime: 2025/03/19 + * @version: 1.0 + */ +@Path("/bs/dzsalary/report") +public class DzSalaryReportController extends com.engine.salary.web.DzSalaryReportController { +} diff --git a/src/com/engine/salary/entity/dzreport/dto/DzSalaryReportDTO.java b/src/com/engine/salary/entity/dzreport/dto/DzSalaryReportDTO.java new file mode 100644 index 000000000..98e85dd16 --- /dev/null +++ b/src/com/engine/salary/entity/dzreport/dto/DzSalaryReportDTO.java @@ -0,0 +1,298 @@ +package com.engine.salary.entity.dzreport.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author:dxfeng + * @createTime: 2025/03/18 + * @version: 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class DzSalaryReportDTO { + private String userId; + private String taxAgentId; + /** + * 个税扣缴义务人 + */ + private String taxAgentName; + + /** + * 姓名 + */ + private String lastName; + /** + * 月份 + */ + private String month; + /** + * 一级部门 + */ + private String firstDepartment; + /** + * 二级部门 + */ + private String secondaryDepartment; + /** + * 三级部门 + */ + private String thirdDepartment; + /** + * 产品分组 + */ + private String productGrouping; + /** + * 离职日期 + */ + private String terminationDate; + /** + * 所在层级部门 + */ + private String currentDepartment; + + /*固定项目*/ + /** + * 入职日期 + */ + private String companyStartDate; + /** + * 状态 + */ + private String status; + /** + * 岗位 + */ + private String jobtitle; + /** + * 合同归属地 + */ + private String placeOfContractOwnership; + /** + * 工资标准 + */ + private String wageStandard; + /** + * 基本工资 + */ + private String basicSalary; + /** + * 岗位工资 + */ + private String postWage; + /** + * 绩效工资标准 + */ + private String performanceBasedSalaryStandards; + /** + * 工种/管理补贴 + */ + private String managementSubsidy; + /** + * 通讯补贴 + */ + private String communicationSubsidy; + /** + * 实习生加班费基数 + */ + private String internshipOvertimePayBase; + + + /*系统自动计算项目*/ + /** + * 司龄 + */ + private String companyWorkYear; + /** + * 系统事假时数 + */ + private String systemPersonalLeaveHours; + /** + * 抵扣后事假时数 + */ + private String deductionOfPersonalLeaveHours; + /** + * 病假时数 + */ + private String sickLeaveHours; + /** + * 加班费基数 + */ + private String overtimePayBase; + /** + * 抵扣后双休加班时数 + */ + private String overtimeHoursOnWeekendsAfterDeduction; + /** + * 抵扣后平时加班时数 + */ + private String overtimeHoursAfterDeduction; + /** + * 节假加班小时数 + */ + private String overtimeHoursDuringHolidays; + /** + * 双休加班小时数 + */ + private String overtimeHoursOnWeekends; + /** + * 平时加班小时数 + */ + private String weekdayOvertimeHours; + /** + * 双休加班费 + */ + private String overtimePayForWeekendsOff; + /** + * 平时加班费 + */ + private String regularOvertimePay; + /** + * 节假加班费 + */ + private String holidayOvertimePay; + /** + * 事假扣款 + */ + private String deductionForPersonalLeave; + /** + * 病假扣款 + */ + private String sickLeaveDeduction; + /** + * 加班费 + */ + private String overtimePay; + /** + * 实习生加班工资 + */ + private String internOvertimePay; + + + /*导入项目*/ + /** + * 绩效工资 + */ + private String meritPay; + /** + * 驻场补贴 + */ + private String residentSubsidy; + /** + * 其他补贴 + */ + private String otherSubsidies; + /** + * 其他收入 + */ + private String other; + /** + * 异动补增 + */ + private String abnormalIncrease; + /** + * 提成 + */ + private String commission; + /** + * 福利 + */ + private String benefit; + /** + * 异动补扣 + */ + private String abnormalDeduction; + /** + * 缺勤扣款 + */ + private String absenteeismDeduction; + /** + * 质量处罚 + */ + private String qualityPenalty; + /** + * 其他扣款 + */ + private String otherDeductions; + + /*应发工资*/ + /** + * 本月应发 + */ + private String shouldBeIssuedThisMonth; + + + /*专项扣除*/ + /** + * 养老个人 + */ + private String elderlyIndividuals; + /** + * 医疗个人 + */ + private String medicalPersonal; + /** + * 失业个人 + */ + private String unemployedIndividuals; + /** + * 公积金个人 + */ + private String individualProvidentFund; + /** + * 社保个人合计 + */ + private String individualSocialSecurityTotal; + /** + * 单位社保合计 + */ + private String unitSocialSecurityTotal; + /** + * 单位公积金 + */ + private String unitProvidentFund; + /** + * 宿舍费(上海大族10000) + */ + private String dormitoryFeesShangHai; + /** + * 水电费(上海大族10000) + */ + private String waterElectricityFeesShanghai; + /** + * 水电费(浙江大族20000) + */ + private String waterElectricityFeesZheJiang; + /** + * 宿舍费(无锡智能30000) + */ + private String dormitoryFeesWuXi; + /** + * 水电费(无锡智能30000) + */ + private String waterElectricityFeesWuXi; + /** + * 福利扣款 + */ + private String welfareDeduction; + /** + * 个税 + */ + private String personalIncomeTax; + /*实发工资*/ + /** + * 当月实发 + */ + private String actualIssuedInTheCurrentMonth; + + /*工资成本*/ + /** + * 公司成本 + */ + private String companyCosts; + +} diff --git a/src/com/engine/salary/entity/dzreport/param/DzSalaryReportParam.java b/src/com/engine/salary/entity/dzreport/param/DzSalaryReportParam.java new file mode 100644 index 000000000..07410652e --- /dev/null +++ b/src/com/engine/salary/entity/dzreport/param/DzSalaryReportParam.java @@ -0,0 +1,24 @@ +package com.engine.salary.entity.dzreport.param; + +import com.engine.salary.common.BaseQueryParam; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author:dxfeng + * @createTime: 2025/03/18 + * @version: 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class DzSalaryReportParam extends BaseQueryParam{ + private String firstDepartment; + private String secondaryDepartment; + private String thirdDepartment; + private String productGrouping; + private String month; +} diff --git a/src/com/engine/salary/entity/dzreport/po/DzSalaryReportPO.java b/src/com/engine/salary/entity/dzreport/po/DzSalaryReportPO.java new file mode 100644 index 000000000..207c9d84e --- /dev/null +++ b/src/com/engine/salary/entity/dzreport/po/DzSalaryReportPO.java @@ -0,0 +1,13 @@ +package com.engine.salary.entity.dzreport.po; + +/** + * @author:dxfeng + * @createTime: 2025/03/18 + * @version: 1.0 + */ +public class DzSalaryReportPO { + private String userId; + private String lastName; + private String departmentId; + private String status; +} diff --git a/src/com/engine/salary/mapper/dzreport/DzSalaryReportMapper.java b/src/com/engine/salary/mapper/dzreport/DzSalaryReportMapper.java new file mode 100644 index 000000000..3f6fc0d30 --- /dev/null +++ b/src/com/engine/salary/mapper/dzreport/DzSalaryReportMapper.java @@ -0,0 +1,31 @@ +package com.engine.salary.mapper.dzreport; + +import com.engine.salary.entity.dzreport.dto.DzSalaryReportDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Set; + +/** + * @author:dxfeng + * @createTime: 2025/03/18 + * @version: 1.0 + */ +public interface DzSalaryReportMapper { + + /** + * 获取工资报表 + * + * @return + */ + List getReportList(@Param("month") String month, @Param("deptIds") Set deptIds); + + + /** + * 获取个税扣缴义务人名称 + * + * @param id + * @return + */ + String getTaxAgentName(@Param("id") String id); +} diff --git a/src/com/engine/salary/mapper/dzreport/DzSalaryReportMapper.xml b/src/com/engine/salary/mapper/dzreport/DzSalaryReportMapper.xml new file mode 100644 index 000000000..0a8b54da9 --- /dev/null +++ b/src/com/engine/salary/mapper/dzreport/DzSalaryReportMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/com/engine/salary/service/DzSalaryReportService.java b/src/com/engine/salary/service/DzSalaryReportService.java new file mode 100644 index 000000000..fa448d9b2 --- /dev/null +++ b/src/com/engine/salary/service/DzSalaryReportService.java @@ -0,0 +1,16 @@ +package com.engine.salary.service; + +import com.engine.salary.entity.dzreport.param.DzSalaryReportParam; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/03/18 + * @version: 1.0 + */ +public interface DzSalaryReportService { + + Map getSalaryReport(DzSalaryReportParam param); + +} diff --git a/src/com/engine/salary/service/impl/DzSalaryReportServiceImpl.java b/src/com/engine/salary/service/impl/DzSalaryReportServiceImpl.java new file mode 100644 index 000000000..932d3134f --- /dev/null +++ b/src/com/engine/salary/service/impl/DzSalaryReportServiceImpl.java @@ -0,0 +1,376 @@ +package com.engine.salary.service.impl; + +import com.engine.core.impl.Service; +import com.engine.salary.component.WeaTableColumnGroup; +import com.engine.salary.encrypt.AESEncryptUtil; +import com.engine.salary.entity.dzreport.dto.DzSalaryReportDTO; +import com.engine.salary.entity.dzreport.param.DzSalaryReportParam; +import com.engine.salary.mapper.dzreport.DzSalaryReportMapper; +import com.engine.salary.service.DzSalaryReportService; +import com.engine.salary.util.db.MapperProxyFactory; +import com.engine.salary.util.page.PageInfo; +import com.engine.salary.util.page.SalaryPageUtil; +import org.apache.commons.lang.StringUtils; +import org.json.JSONObject; +import weaver.conn.RecordSet; +import weaver.hrm.User; +import weaver.hrm.company.DepartmentComInfo; +import weaver.hrm.definedfield.HrmFieldManager; +import weaver.hrm.resource.ResourceComInfo; + +import java.util.*; + +/** + * @author:dxfeng + * @createTime: 2025/03/18 + * @version: 1.0 + */ +public class DzSalaryReportServiceImpl extends Service implements DzSalaryReportService { + DepartmentComInfo departmentComInfo = new DepartmentComInfo(); + RecordSet rs = new RecordSet(); + + private DzSalaryReportMapper getDzSalaryReportMapper() { + return MapperProxyFactory.getProxy(DzSalaryReportMapper.class); + } + + + @Override + public Map getSalaryReport(DzSalaryReportParam queryParam) { + Map returnMap = new HashMap<>(); + + String firstLevelDepartment = queryParam.getFirstDepartment(); + String secondaryDepartment = queryParam.getSecondaryDepartment(); + String thirdDepartment = queryParam.getThirdDepartment(); + String month = queryParam.getMonth(); + Set departmentIds = new HashSet<>(); + if (StringUtils.isNotBlank(thirdDepartment)) { + departmentIds.add(thirdDepartment); + } else { + if (StringUtils.isNotBlank(secondaryDepartment)) { + ArrayList allChildDeptByDepId = departmentComInfo.getAllChildDeptByDepId(new ArrayList(), secondaryDepartment); + departmentIds.addAll(allChildDeptByDepId); + } else { + if (StringUtils.isNotBlank(firstLevelDepartment)) { + ArrayList allChildDeptByDepId = departmentComInfo.getAllChildDeptByDepId(new ArrayList(), firstLevelDepartment); + departmentIds.addAll(allChildDeptByDepId); + } + } + } + + + List dzSalaryReportDTOS = getDzSalaryReportMapper().getReportList(month, departmentIds); + PageInfo pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), dzSalaryReportDTOS, DzSalaryReportDTO.class); + // 遍历List 填充报表数据 + List list = pageInfo.getList(); + for (DzSalaryReportDTO report : list) { + // 人员基本信息 + fillResourceInfo(report); + // 薪资项目信息 + fillSalaryInfo(report); + } + + returnMap.put("pageInfo", pageInfo); + returnMap.put("columns", getColumnGroups()); + return returnMap; + } + + /** + * 填充薪资信息 + * + * @param report + */ + private void fillSalaryInfo(DzSalaryReportDTO report) { + String userId = report.getUserId(); + String month = report.getMonth(); + String taxAgentId = report.getTaxAgentId(); + + if (StringUtils.isNotBlank(taxAgentId)) { + String taxAgentName = getDzSalaryReportMapper().getTaxAgentName(taxAgentId); + report.setTaxAgentName(taxAgentName); + } + + Map salaryItemMap = new HashMap<>(); + rs.executeQuery("select item.name ,result.result_value " + + "from hrsa_salary_acct_record record " + + "inner join hrsa_salary_acct_result result on record.id = result.salary_acct_record_id and result.delete_type = 0 and record.delete_type = 0 " + + "inner join hrsa_salary_item item on result.salary_item_id = item.id and item.delete_type = 0 " + + "inner join hrmresource e on e.id= result.employee_id " + + "where e.id = ? and record.salary_month=? and result.tax_agent_id=? ", userId, month, taxAgentId); + while (rs.next()) { + // 获取薪资项的值,并解密 + salaryItemMap.put(rs.getString("name"), AESEncryptUtil.decrypt(rs.getString("result_value"))); + } + // 设置值 + report.setWageStandard(salaryItemMap.get("工资标准")); + report.setBasicSalary(salaryItemMap.get("基本工资")); + report.setPostWage(salaryItemMap.get("岗位工资")); + report.setPerformanceBasedSalaryStandards(salaryItemMap.get("绩效工资标准")); + report.setManagementSubsidy(salaryItemMap.get("工种/管理补贴")); + report.setCommunicationSubsidy(salaryItemMap.get("通讯补贴")); + report.setInternshipOvertimePayBase(salaryItemMap.get("实习生加班费基数")); + report.setSystemPersonalLeaveHours(salaryItemMap.get("系统事假时数")); + report.setDeductionOfPersonalLeaveHours(salaryItemMap.get("抵扣后事假时数")); + report.setSickLeaveHours(salaryItemMap.get("病假时数")); + report.setOvertimePayBase(salaryItemMap.get("加班费基数")); + report.setOvertimeHoursOnWeekendsAfterDeduction(salaryItemMap.get("抵扣后双休加班时数")); + report.setOvertimeHoursAfterDeduction(salaryItemMap.get("抵扣后平时加班时数")); + report.setOvertimeHoursDuringHolidays(salaryItemMap.get("节假加班小时数")); + report.setOvertimeHoursOnWeekends(salaryItemMap.get("双休加班小时数")); + report.setWeekdayOvertimeHours(salaryItemMap.get("平时加班小时数")); + report.setOvertimePayForWeekendsOff(salaryItemMap.get("双休加班费")); + report.setRegularOvertimePay(salaryItemMap.get("平时加班费")); + report.setHolidayOvertimePay(salaryItemMap.get("节假加班费")); + report.setDeductionForPersonalLeave(salaryItemMap.get("事假扣款")); + report.setSickLeaveDeduction(salaryItemMap.get("病假扣款")); + report.setOvertimePay(salaryItemMap.get("加班费")); + report.setInternOvertimePay(salaryItemMap.get("实习生加班工资")); + report.setMeritPay(salaryItemMap.get("绩效工资")); + report.setResidentSubsidy(salaryItemMap.get("驻场补贴")); + report.setOtherSubsidies(salaryItemMap.get("其他补贴")); + report.setOther(salaryItemMap.get("其他收入")); + report.setAbnormalIncrease(salaryItemMap.get("异动补增")); + report.setCommission(salaryItemMap.get("提成")); + report.setBenefit(salaryItemMap.get("福利")); + report.setAbnormalDeduction(salaryItemMap.get("异动补扣")); + report.setAbsenteeismDeduction(salaryItemMap.get("缺勤扣款")); + report.setQualityPenalty(salaryItemMap.get("质量处罚")); + report.setOtherDeductions(salaryItemMap.get("其他扣款")); + report.setShouldBeIssuedThisMonth(salaryItemMap.get("本月应发")); + report.setElderlyIndividuals(salaryItemMap.get("养老个人")); + report.setMedicalPersonal(salaryItemMap.get("医疗个人")); + report.setUnemployedIndividuals(salaryItemMap.get("失业个人")); + report.setIndividualProvidentFund(salaryItemMap.get("公积金个人")); + report.setIndividualSocialSecurityTotal(salaryItemMap.get("社保个人合计")); + report.setUnitSocialSecurityTotal(salaryItemMap.get("单位社保合计")); + report.setUnitProvidentFund(salaryItemMap.get("单位公积金")); + report.setDormitoryFeesShangHai(salaryItemMap.get("宿舍费(上海大族10000)")); + report.setWaterElectricityFeesShanghai(salaryItemMap.get("水电费(上海大族10000)")); + report.setWaterElectricityFeesZheJiang(salaryItemMap.get("水电费(浙江大族20000)")); + report.setDormitoryFeesWuXi(salaryItemMap.get("宿舍费(无锡智能30000)")); + report.setWaterElectricityFeesWuXi(salaryItemMap.get("水电费(无锡智能30000)")); + report.setWelfareDeduction(salaryItemMap.get("福利扣款")); + report.setPersonalIncomeTax(salaryItemMap.get("个税")); + report.setActualIssuedInTheCurrentMonth(salaryItemMap.get("当月实发")); + report.setCompanyCosts(salaryItemMap.get("公司成本")); + + + } + + /** + * 填充人员信息 + * + * @param report + */ + private void fillResourceInfo(DzSalaryReportDTO report) { + String userId = report.getUserId(); + try { + ResourceComInfo resourceComInfo = new ResourceComInfo(); + String status = resourceComInfo.getStatus(userId); + report.setLastName(resourceComInfo.getLastname(userId)); + report.setStatus(getResourceFieldText(status, -1, "status")); + if ("5".equals(status)) { + // 离职日期 + rs.executeQuery("SELECT MAX(changedate) as dismissdate FROM HrmStatusHistory WHERE resourceid= ? and type_n=5", userId); + if (rs.next()) { + String dismissDate = rs.getString("dismissdate"); + if(StringUtils.isBlank(dismissDate)){ + dismissDate = resourceComInfo.getEndDate(userId); + } + report.setTerminationDate(dismissDate); + } + } + String departmentId = resourceComInfo.getDepartmentID(userId); + report.setCurrentDepartment(getResourceFieldText(departmentId, -1, "departmentid")); + List departmentLevel = getDepartmentLevel(departmentId); + report.setFirstDepartment(getResourceFieldText(departmentLevel.get(0), -1, "departmentid")); + report.setSecondaryDepartment(getResourceFieldText(departmentLevel.get(1), -1, "departmentid")); + report.setThirdDepartment(getResourceFieldText(departmentLevel.get(2), -1, "departmentid")); + + String jobTitle = resourceComInfo.getJobTitle(userId); + report.setJobtitle(getResourceFieldText(jobTitle, -1, "jobtitle")); + String companyStartDate = resourceComInfo.getCompanyStartDate(userId); + report.setCompanyStartDate(companyStartDate); + String companyWorkYear = resourceComInfo.getCompanyWorkYear(userId); + report.setCompanyWorkYear(companyWorkYear); + + // 人员自定义表信息 + rs.executeQuery("select field21 from cus_fielddata where SCOPE ='HrmCustomFieldByInfoType' and SCOPEID = ? and id = ?", -1, userId); + if (rs.next()) { + String field21 = rs.getString("field21"); + if (StringUtils.isNotBlank(field21)) { + report.setProductGrouping(getResourceFieldText(field21, -1, "field21")); + } + } + + rs.executeQuery("select field3 from cus_fielddata where SCOPE ='HrmCustomFieldByInfoType' and SCOPEID = ? and id = ?", 3, userId); + if (rs.next()) { + String field3 = rs.getString("field3"); + if (StringUtils.isNotBlank(field3)) { + report.setPlaceOfContractOwnership(getResourceFieldText(field3, -1, "field3")); + } + } + + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 构建报表表头 + * + * @return + */ + private List getColumnGroups() { + List result = new ArrayList<>(); + result.add(new WeaTableColumnGroup("150", "个税扣缴义务人", "taxAgentName")); + result.add(new WeaTableColumnGroup("150", "姓名", "lastName")); + result.add(new WeaTableColumnGroup("150", "月份", "month")); + result.add(new WeaTableColumnGroup("150", "一级部门", "firstDepartment")); + result.add(new WeaTableColumnGroup("150", "二级部门", "secondaryDepartment")); + result.add(new WeaTableColumnGroup("150", "三级部门", "thirdDepartment")); + result.add(new WeaTableColumnGroup("150", "产品分组", "productGrouping")); + result.add(new WeaTableColumnGroup("150", "离职日期", "terminationDate")); + result.add(new WeaTableColumnGroup("150", "所在层级部门", "currentDepartment")); + + WeaTableColumnGroup fixedProjectColumn = new WeaTableColumnGroup("300", "固定项目", "fixedProject"); + List fixedProjectChild = new ArrayList<>(); + fixedProjectChild.add(new WeaTableColumnGroup("150", "入职日期", "companyStartDate")); + fixedProjectChild.add(new WeaTableColumnGroup("150", "状态", "status")); + fixedProjectChild.add(new WeaTableColumnGroup("150", "岗位", "jobtitle")); + fixedProjectChild.add(new WeaTableColumnGroup("150", "合同归属地", "placeOfContractOwnership")); + fixedProjectChild.add(new WeaTableColumnGroup("150", "工资标准", "wageStandard")); + fixedProjectChild.add(new WeaTableColumnGroup("150", "基本工资", "basicSalary")); + fixedProjectChild.add(new WeaTableColumnGroup("150", "岗位工资", "postWage")); + fixedProjectChild.add(new WeaTableColumnGroup("150", "绩效工资标准", "performanceBasedSalaryStandards")); + fixedProjectChild.add(new WeaTableColumnGroup("150", "工种/管理补贴", "managementSubsidy")); + fixedProjectChild.add(new WeaTableColumnGroup("150", "通讯补贴", "communicationSubsidy")); + fixedProjectChild.add(new WeaTableColumnGroup("150", "实习生加班费基数", "internshipOvertimePayBase")); + fixedProjectColumn.setChildren(fixedProjectChild); + result.add(fixedProjectColumn); + + WeaTableColumnGroup autoCalculateProjectColumn = new WeaTableColumnGroup("300", "系统自动计算项目", "autoCalculateProject"); + List autoCalculateProjectChild = new ArrayList<>(); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "司龄", "companyWorkYear")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "系统事假时数", "systemPersonalLeaveHours")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "抵扣后事假时数", "deductionOfPersonalLeaveHours")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "病假时数", "sickLeaveHours")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "加班费基数", "overtimePayBase")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "抵扣后双休加班时数", "overtimeHoursOnWeekendsAfterDeduction")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "抵扣后平时加班时数", "overtimeHoursAfterDeduction")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "节假加班小时数", "overtimeHoursDuringHolidays")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "双休加班小时数", "overtimeHoursOnWeekends")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "平时加班小时数", "weekdayOvertimeHours")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "双休加班费", "overtimePayForWeekendsOff")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "平时加班费", "regularOvertimePay")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "节假加班费", "holidayOvertimePay")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "事假扣款", "deductionForPersonalLeave")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "病假扣款", "sickLeaveDeduction")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "加班费", "overtimePay")); + autoCalculateProjectChild.add(new WeaTableColumnGroup("150", "实习生加班工资", "internOvertimePay")); + autoCalculateProjectColumn.setChildren(autoCalculateProjectChild); + result.add(autoCalculateProjectColumn); + + WeaTableColumnGroup importProjectColumn = new WeaTableColumnGroup("300", "导入项目", "importProject"); + List importProjectChild = new ArrayList<>(); + importProjectChild.add(new WeaTableColumnGroup("150", "绩效工资", "meritPay")); + importProjectChild.add(new WeaTableColumnGroup("150", "驻场补贴", "residentSubsidy")); + importProjectChild.add(new WeaTableColumnGroup("150", "其他补贴", "otherSubsidies")); + importProjectChild.add(new WeaTableColumnGroup("150", "其他收入", "other")); + importProjectChild.add(new WeaTableColumnGroup("150", "异动补增", "abnormalIncrease")); + importProjectChild.add(new WeaTableColumnGroup("150", "提成", "commission")); + importProjectChild.add(new WeaTableColumnGroup("150", "福利", "benefit")); + importProjectChild.add(new WeaTableColumnGroup("150", "异动补扣", "abnormalDeduction")); + importProjectChild.add(new WeaTableColumnGroup("150", "缺勤扣款", "absenteeismDeduction")); + importProjectChild.add(new WeaTableColumnGroup("150", "质量处罚", "qualityPenalty")); + importProjectChild.add(new WeaTableColumnGroup("150", "其他扣款", "otherDeductions")); + importProjectColumn.setChildren(importProjectChild); + result.add(importProjectColumn); + + WeaTableColumnGroup salaryPayableColumn = new WeaTableColumnGroup("300", "应发工资", "salaryPayable"); + List salaryPayableChild = new ArrayList<>(); + salaryPayableChild.add(new WeaTableColumnGroup("150", "本月应发", "shouldBeIssuedThisMonth")); + salaryPayableColumn.setChildren(salaryPayableChild); + result.add(salaryPayableColumn); + + WeaTableColumnGroup specialDeductionColumn = new WeaTableColumnGroup("300", "专项扣除", "specialDeduction"); + List specialDeductionChild = new ArrayList<>(); + specialDeductionChild.add(new WeaTableColumnGroup("150", "养老个人", "elderlyIndividuals")); + specialDeductionChild.add(new WeaTableColumnGroup("150", "医疗个人", "medicalPersonal")); + specialDeductionChild.add(new WeaTableColumnGroup("150", "失业个人", "unemployedIndividuals")); + specialDeductionChild.add(new WeaTableColumnGroup("150", "公积金个人", "individualProvidentFund")); + specialDeductionChild.add(new WeaTableColumnGroup("150", "社保个人合计", "individualSocialSecurityTotal")); + specialDeductionChild.add(new WeaTableColumnGroup("150", "单位社保合计", "unitSocialSecurityTotal")); + specialDeductionChild.add(new WeaTableColumnGroup("150", "单位公积金", "unitProvidentFund")); + specialDeductionChild.add(new WeaTableColumnGroup("150", "宿舍费(上海大族10000)", "dormitoryFeesShanghai")); + specialDeductionChild.add(new WeaTableColumnGroup("150", "水电费(上海大族10000)", "waterElectricityFeesShanghai")); + specialDeductionChild.add(new WeaTableColumnGroup("150", "水电费(浙江大族20000)", "waterElectricityFeesZheJiang")); + specialDeductionChild.add(new WeaTableColumnGroup("150", "宿舍费(无锡智能30000)", "dormitoryFeesWuXi")); + specialDeductionChild.add(new WeaTableColumnGroup("150", "水电费(无锡智能30000)", "waterElectricityFeesWuXi")); + specialDeductionChild.add(new WeaTableColumnGroup("150", "福利扣款", "welfareDeduction")); + specialDeductionChild.add(new WeaTableColumnGroup("150", "个税", "personalIncomeTax")); + specialDeductionColumn.setChildren(specialDeductionChild); + result.add(specialDeductionColumn); + + WeaTableColumnGroup netSalaryColumn = new WeaTableColumnGroup("300", "实发工资", "netSalary"); + List netSalaryChild = new ArrayList<>(); + netSalaryChild.add(new WeaTableColumnGroup("150", "当月实发", "actualIssuedInTheCurrentMonth")); + netSalaryColumn.setChildren(netSalaryChild); + result.add(netSalaryColumn); + + WeaTableColumnGroup wageCostColumn = new WeaTableColumnGroup("300", "工资成本", "wageCost"); + List wageCostChild = new ArrayList<>(); + wageCostChild.add(new WeaTableColumnGroup("150", "公司成本", "companyCosts")); + wageCostColumn.setChildren(wageCostChild); + result.add(wageCostColumn); + + return result; + } + + + /** + * 获取人员表字段的显示文本 + * + * @param id + * @param scopeId + * @param fieldName + * @return + */ + private String getResourceFieldText(String id, Integer scopeId, String fieldName) { + HrmFieldManager hfm = new HrmFieldManager("HrmCustomFieldByInfoType", scopeId); + JSONObject hrmFieldConf = hfm.getHrmFieldConf(fieldName); + User user = new User(); + user.setUid(1); + try { + if (hfm.isBaseField(fieldName) && "jobactivity".equals(fieldName)) { + hrmFieldConf.put("type", 282); + } + return hfm.getFieldvalue(null, user, null, hrmFieldConf.getString("dmlurl"), hrmFieldConf.getInt("id"), hrmFieldConf.getInt("fieldhtmltype"), hrmFieldConf.getInt("type"), id, 0, fieldName); + } catch (Exception e) { + return ""; + } + } + + /** + * 构建部门层级 + * + * @param departmentId + * @return + */ + private List getDepartmentLevel(String departmentId) { + List departmentIds = new ArrayList<>(); + departmentIds.add(null); + departmentIds.add(null); + departmentIds.add(null); + departmentIds.add(0, departmentId); + boolean isFind = true; + while (isFind) { + departmentId = departmentComInfo.getDepartmentsupdepid(departmentId); + if (StringUtils.isNotBlank(departmentId) && !"0".equals(departmentId)) { + departmentIds.add(0, departmentId); + } else { + isFind = false; + } + } + return departmentIds; + } +} diff --git a/src/com/engine/salary/web/DzSalaryReportController.java b/src/com/engine/salary/web/DzSalaryReportController.java new file mode 100644 index 000000000..c545a203e --- /dev/null +++ b/src/com/engine/salary/web/DzSalaryReportController.java @@ -0,0 +1,37 @@ +package com.engine.salary.web; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.dzreport.param.DzSalaryReportParam; +import com.engine.salary.util.ResponseResult; +import com.engine.salary.wrapper.DzSalaryReportWrapper; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/03/19 + * @version: 1.0 + */ +public class DzSalaryReportController { + private DzSalaryReportWrapper getDzSalaryReportWrapper(User user) { + return ServiceUtil.getService(DzSalaryReportWrapper.class, user); + } + + @POST + @Path("/getSalaryReport") + @Produces(MediaType.APPLICATION_JSON) + public String getSalaryReport(@Context HttpServletRequest request, @Context HttpServletResponse response,@RequestBody DzSalaryReportParam queryParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getDzSalaryReportWrapper(user)::getSalaryReport, queryParam); + } +} diff --git a/src/com/engine/salary/wrapper/DzSalaryReportWrapper.java b/src/com/engine/salary/wrapper/DzSalaryReportWrapper.java new file mode 100644 index 000000000..0a2f95697 --- /dev/null +++ b/src/com/engine/salary/wrapper/DzSalaryReportWrapper.java @@ -0,0 +1,25 @@ +package com.engine.salary.wrapper; + +import com.engine.common.util.ServiceUtil; +import com.engine.core.impl.Service; +import com.engine.salary.entity.dzreport.param.DzSalaryReportParam; +import com.engine.salary.service.DzSalaryReportService; +import com.engine.salary.service.impl.DzSalaryReportServiceImpl; +import weaver.hrm.User; + +import java.util.Map; + +/** + * @author:dxfeng + * @createTime: 2025/03/19 + * @version: 1.0 + */ +public class DzSalaryReportWrapper extends Service { + private DzSalaryReportService getDzSalaryReportService(User user) { + return ServiceUtil.getService(DzSalaryReportServiceImpl.class, user); + } + + public Map getSalaryReport(DzSalaryReportParam queryParam) { + return getDzSalaryReportService(user).getSalaryReport(queryParam); + } +}