From 8c919c713f68f556bba570771c5f9ccf2918a54b Mon Sep 17 00:00:00 2001 From: yinq Date: Tue, 8 Oct 2024 15:22:02 +0800 Subject: [PATCH] =?UTF-8?q?change=20-=20=E4=BF=AE=E6=94=B9=E5=B7=A5?= =?UTF-8?q?=E8=B5=84=E7=94=9F=E6=88=90=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/prod/domain/ProdPlanExecuteUser.java | 99 ++++++++++++++++ .../impl/RecordStaffSalaryServiceImpl.java | 109 +++++++++++++++--- .../mes/prod/ProdPlanExecuteUserMapper.xml | 40 ++++--- 3 files changed, 216 insertions(+), 32 deletions(-) diff --git a/os-mes/src/main/java/com/os/mes/prod/domain/ProdPlanExecuteUser.java b/os-mes/src/main/java/com/os/mes/prod/domain/ProdPlanExecuteUser.java index 08b17bd..0752c44 100644 --- a/os-mes/src/main/java/com/os/mes/prod/domain/ProdPlanExecuteUser.java +++ b/os-mes/src/main/java/com/os/mes/prod/domain/ProdPlanExecuteUser.java @@ -4,6 +4,7 @@ import java.math.BigDecimal; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.os.common.annotation.Excel; @@ -116,6 +117,104 @@ public class ProdPlanExecuteUser extends BaseEntity { @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date updatedTime; + /** + * 工资系数 + */ + @Excel(name = "工资系数") + private BigDecimal wageCoefficient; + + /** + * 客户要求输送带长度(m) + */ + @Excel(name = "客户要求输送带长度(m)") + private BigDecimal BeltRequiredLength; + + /** + * 成型面积 + */ + @Excel(name = "成型面积") + @JsonProperty(value = "FormingArea") + private BigDecimal FormingArea; + + /** + * 硫化面积 + */ + @Excel(name = "硫化面积") + @JsonProperty(value = "SulfurizationArea") + private BigDecimal SulfurizationArea; + + /** 身份证 */ + @Excel(name = "身份证") + private String idCard; + + /** + * 班组编号 + */ + @Excel(name = "班组编号") + private String teamCode; + + /** + * 班组名称 + */ + @Excel(name = "班组名称") + private String teamName; + + public String getIdCard() { + return idCard; + } + + public void setIdCard(String idCard) { + this.idCard = idCard; + } + + public String getTeamCode() { + return teamCode; + } + + public void setTeamCode(String teamCode) { + this.teamCode = teamCode; + } + + public String getTeamName() { + return teamName; + } + + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + public BigDecimal getBeltRequiredLength() { + return BeltRequiredLength; + } + + public void setBeltRequiredLength(BigDecimal beltRequiredLength) { + BeltRequiredLength = beltRequiredLength; + } + + public BigDecimal getFormingArea() { + return FormingArea; + } + + public void setFormingArea(BigDecimal formingArea) { + FormingArea = formingArea; + } + + public BigDecimal getSulfurizationArea() { + return SulfurizationArea; + } + + public void setSulfurizationArea(BigDecimal sulfurizationArea) { + SulfurizationArea = sulfurizationArea; + } + + public BigDecimal getWageCoefficient() { + return wageCoefficient; + } + + public void setWageCoefficient(BigDecimal wageCoefficient) { + this.wageCoefficient = wageCoefficient; + } + public String getStationName() { return stationName; } diff --git a/os-mes/src/main/java/com/os/mes/record/service/impl/RecordStaffSalaryServiceImpl.java b/os-mes/src/main/java/com/os/mes/record/service/impl/RecordStaffSalaryServiceImpl.java index c7afc75..02538f2 100644 --- a/os-mes/src/main/java/com/os/mes/record/service/impl/RecordStaffSalaryServiceImpl.java +++ b/os-mes/src/main/java/com/os/mes/record/service/impl/RecordStaffSalaryServiceImpl.java @@ -3,6 +3,7 @@ package com.os.mes.record.service.impl; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; +import java.util.stream.Collectors; import com.os.common.exception.ServiceException; import com.os.common.utils.DateUtils; @@ -19,8 +20,10 @@ import com.os.mes.base.mapper.BaseStaffInfoMapper; import com.os.mes.base.mapper.BaseTeamMembersMapper; import com.os.mes.prod.domain.ProdOrderInfo; import com.os.mes.prod.domain.ProdPlanDetail; +import com.os.mes.prod.domain.ProdPlanExecuteUser; import com.os.mes.prod.domain.ProdPlanInfo; import com.os.mes.prod.mapper.ProdOrderInfoMapper; +import com.os.mes.prod.mapper.ProdPlanExecuteUserMapper; import com.os.mes.prod.mapper.ProdPlanInfoMapper; import com.os.mes.record.domain.RecordStaffCommute; import com.os.mes.record.domain.StaffSalaryVo; @@ -60,7 +63,7 @@ public class RecordStaffSalaryServiceImpl implements IRecordStaffSalaryService { private BaseProcessInfoMapper baseProcessInfoMapper; @Autowired - private RecordStaffCommuteMapper recordStaffCommuteMapper; + private ProdPlanExecuteUserMapper prodPlanExecuteUserMapper; @Autowired private IERPPortService portService; @@ -134,12 +137,12 @@ public class RecordStaffSalaryServiceImpl implements IRecordStaffSalaryService { /** * 生成班组员工工资 - * (工序硫化的工资计算方法 = 硫化系数*硫化面积*(工资系数/参加该工序的所有人的工资系数的总和) - * 这里的硫化面积=硫化米数/客户要求总米数*硫化面积) - * + * (工序硫化的工资计算方法 = 硫化系数*硫化面积*(工资系数/参加该工序的所有人的工资系数的总和) + * 这里的硫化面积=硫化米数/客户要求总米数*硫化面积) + *

* 1、需知道每个员工在时间范围内的上班天数 * 2、需要知道时间范围内生产工单生产完成多少米 - * 3、工序硫化员工工资 = 硫化系数 * (每个工单的实际硫化米数/客户要求总米数*硫化面积) * (员工的工资系数/参加该工序的所有人的工资系数的总和) * (当前员工在班时长/该工序的所有人在班时长) + * 3、工序硫化员工工资 = 硫化系数 * (每个工单的实际硫化米数/客户要求总米数*硫化面积) * (员工的工资系数/参加该工序的所有人的工资系数的总和) * * @param recordStaffSalary * @return @@ -150,14 +153,12 @@ public class RecordStaffSalaryServiceImpl implements IRecordStaffSalaryService { //调用最新工资系数接口 LatestSalary salaryData = portService.getERPLatestSalaryData(new ERPParamDto()); - //遍历工序 - BaseProcessInfo selectProcessInfo = new BaseProcessInfo(); - selectProcessInfo.setProcessCode(recordStaffSalary.getProcessCode()); - List processInfoList = baseProcessInfoMapper.selectBaseProcessInfoList(selectProcessInfo); + List teamMembers = baseTeamMembersMapper.selectBaseTeamMembersList(new BaseTeamMembers()); - ProdPlanInfo planInfo = new ProdPlanInfo(); Map params = recordStaffSalary.getParams(); - planInfo.setParams(params); + ProdPlanExecuteUser selectExecuteUser = new ProdPlanExecuteUser(); + selectExecuteUser.setParams(params); //beginOrderDate、endOrderDate + List planUserList = prodPlanExecuteUserMapper.selectProdPlanExecuteUserList(selectExecuteUser); Date beginOrderDate = null; Date endOrderDate = null; @@ -170,14 +171,85 @@ public class RecordStaffSalaryServiceImpl implements IRecordStaffSalaryService { long objId = 1L; String taskCode = PlanCodeUtils.getTaskCode(); + Map> orderCodeMap = planUserList.stream().collect(Collectors.groupingBy(ProdPlanExecuteUser::getOrderCode)); + for (String planCode : orderCodeMap.keySet()) { + List orderCodeUserList = orderCodeMap.get(planCode); + for (ProdPlanExecuteUser prodPlanExecuteUser : orderCodeUserList) { + //工序工资系数 + BigDecimal coefficient = new BigDecimal(0); + //工序生产面积 + BigDecimal totalArea = new BigDecimal(0); + ///参加该工序的所有人的工资系数的总和 + BigDecimal wageCoefficientSum = new BigDecimal(0); + //硫化工序 工序硫化的工资 = 硫化系数*硫化面积*(工资系数/参加该工序的所有人的工资系数的总和) + //硫化面积=硫化米数/客户要求总米数*硫化面积 + if (prodPlanExecuteUser.getProcessCode().equals("1002")) { + coefficient = salaryData.getVulcanizationCoefficient(); + totalArea = orderCodeUserList.stream().filter(e -> e.getProcessCode().equals("1002")) + .map(e -> e.getCompleteAmount().divide(e.getBeltRequiredLength(), 6, RoundingMode.HALF_UP) + .multiply(e.getSulfurizationArea())).reduce(BigDecimal.ZERO, BigDecimal::add); + wageCoefficientSum = orderCodeUserList.stream().filter(e -> e.getProcessCode().equals("1002")) + .map(ProdPlanExecuteUser::getWageCoefficient).reduce(BigDecimal.ZERO, BigDecimal::add); + } + //成型工序 + if (prodPlanExecuteUser.getProcessCode().equals("1001")) { + coefficient = salaryData.getFormingCoefficient(); + totalArea = orderCodeUserList.stream().filter(e -> e.getProcessCode().equals("1001")) + .map(e -> e.getCompleteAmount().divide(e.getBeltRequiredLength(), 6, RoundingMode.HALF_UP) + .multiply(e.getFormingArea())).reduce(BigDecimal.ZERO, BigDecimal::add); + wageCoefficientSum = orderCodeUserList.stream().filter(e -> e.getProcessCode().equals("1001")) + .map(ProdPlanExecuteUser::getWageCoefficient).reduce(BigDecimal.ZERO, BigDecimal::add); + } - //(每个工单的实际硫化米数/客户要求总米数*硫化面积) - for (BaseProcessInfo processInfo : processInfoList) { - List salaryVoList = selectSumEmployeeSalary(processInfo.getProcessCode()); - for (StaffSalaryVo staffSalaryVo : salaryVoList) { + BigDecimal revenueAmount = new BigDecimal(0);//员工收入 + if (wageCoefficientSum.compareTo(BigDecimal.ZERO) > 0){ + BigDecimal staffCoefficient = prodPlanExecuteUser.getWageCoefficient().divide(wageCoefficientSum, 6, RoundingMode.HALF_UP); + revenueAmount = coefficient.multiply(totalArea).multiply(staffCoefficient).setScale(2, RoundingMode.HALF_UP); + } + if (StringUtils.isNotEmpty(prodPlanExecuteUser.getTeamCode())) { + for (BaseTeamMembers teamMember : teamMembers) { + if (prodPlanExecuteUser.getTeamCode().contains(teamMember.getTeamCode())) { + if (StringUtils.isEmpty(prodPlanExecuteUser.getTeamName())) { + prodPlanExecuteUser.setTeamName(teamMember.getTeamName()); + } else { + prodPlanExecuteUser.setTeamName(prodPlanExecuteUser.getTeamName() + "," + teamMember.getTeamName()); + } + } + } + } + String teamCode = prodPlanExecuteUser.getTeamCode(); + String teamName = prodPlanExecuteUser.getTeamName(); + String idCard = prodPlanExecuteUser.getIdCard(); + RecordStaffSalary staffSalary = new RecordStaffSalary(); + for (RecordStaffSalary staff : result) { + if (staff.getCardId().equals(idCard) && staff.getGroupId().equals(prodPlanExecuteUser.getTeamCode())) { + staffSalary = staff; + } + } + if (StringUtils.isEmpty(staffSalary.getCardId())) { + staffSalary.setObjId(objId++); + staffSalary.setTaskCode(taskCode); + staffSalary.setIdCard(prodPlanExecuteUser.getIdCard()); + staffSalary.setGroupId(teamCode); + staffSalary.setEventDate(new Date()); + staffSalary.setSalaryCategory("收入"); + staffSalary.setRevenueClass("完成生产任务"); + revenueAmount = revenueAmount.setScale(2, RoundingMode.HALF_UP); + staffSalary.setRevenueAmount(revenueAmount); + staffSalary.setSalaryCoefficient(prodPlanExecuteUser.getWageCoefficient()); + staffSalary.setStaffName(prodPlanExecuteUser.getStaffName()); + staffSalary.setCardId(idCard); + staffSalary.setTeamName(teamName); + staffSalary.setBeginDate(beginOrderDate); + staffSalary.setEndDate(endOrderDate); + result.add(staffSalary); + } else { + staffSalary.setRevenueAmount(staffSalary.getRevenueAmount().add(revenueAmount)); + staffSalary.setGroupId(teamCode); + staffSalary.setTeamName(teamName); + } } - } return result; @@ -186,6 +258,7 @@ public class RecordStaffSalaryServiceImpl implements IRecordStaffSalaryService { /** * 该工序所有员工的工序工资系数 + * * @param processCode * @return */ @@ -208,12 +281,12 @@ public class RecordStaffSalaryServiceImpl implements IRecordStaffSalaryService { sumSalaryCoefficient = sumSalaryCoefficient.add(baseStaffInfo.getWageCoefficient()); boolean isRepeat = true; for (StaffSalaryVo salaryVo : employeeList) { - if (salaryVo.getStaffId().equals(baseStaffInfo.getStaffId())){ + if (salaryVo.getStaffId().equals(baseStaffInfo.getStaffId())) { salaryVo.setSalaryCoefficient(salaryVo.getSumSalaryCoefficient().add(sumSalaryCoefficient)); isRepeat = false; } } - if (isRepeat){ + if (isRepeat) { employeeList.add(salary); } } diff --git a/os-mes/src/main/resources/mapper/mes/prod/ProdPlanExecuteUserMapper.xml b/os-mes/src/main/resources/mapper/mes/prod/ProdPlanExecuteUserMapper.xml index 4059c1b..0a7c436 100644 --- a/os-mes/src/main/resources/mapper/mes/prod/ProdPlanExecuteUserMapper.xml +++ b/os-mes/src/main/resources/mapper/mes/prod/ProdPlanExecuteUserMapper.xml @@ -21,6 +21,12 @@ + + + + + + @@ -39,29 +45,35 @@ ppeu.updated_by, ppeu.updated_time, bsi.staff_name, - bpl.product_line_name station_name + bsi.wage_coefficient, + bpl.product_line_name station_name, + pod.BeltRequiredLength, + pod.SulfurizationArea, + pod.FormingArea, + bsi.pass_word, + bsi.team_code from prod_plan_execute_user ppeu left join base_staff_info bsi on bsi.staff_id = ppeu.staff_id left join base_product_line bpl on bpl.product_line_code = ppeu.station_code + left join prod_order_detail pod on ppeu.order_code = pod.SeqNo