From 6c14d159d3207725a49007a76b6462f25ce3e90b Mon Sep 17 00:00:00 2001 From: liuzongkun999 Date: Thu, 13 Mar 2025 00:03:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=90=E6=9C=AC=E5=88=86=E6=9E=90=E4=BF=AE?= =?UTF-8?q?=E6=94=B93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oa/controller/SysOaCostController.java | 2 +- .../java/com/ruoyi/oa/domain/vo/ClaimVO.java | 12 ++ .../com/ruoyi/oa/domain/vo/MaterialVO.java | 12 ++ .../com/ruoyi/oa/domain/vo/SysOaCostList.java | 34 --- .../com/ruoyi/oa/domain/vo/SysOaCostRow.java | 7 +- .../com/ruoyi/oa/domain/vo/UserCostVO.java | 12 ++ .../ruoyi/oa/mapper/SysOaProjectMapper.java | 4 + .../ruoyi/oa/service/ISysOaCostService.java | 15 +- .../oa/service/impl/SysOaCostServiceImpl.java | 200 +----------------- .../mapper/oa/SysOaProjectMapper.xml | 72 +++++++ 10 files changed, 133 insertions(+), 237 deletions(-) create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/ClaimVO.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/MaterialVO.java delete mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaCostList.java create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/UserCostVO.java diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaCostController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaCostController.java index db1e2c7..7c1b59a 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaCostController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/SysOaCostController.java @@ -120,7 +120,7 @@ public class SysOaCostController extends BaseController { @GetMapping("/{projectId}") public R getDetail(@NotNull(message = "项目id不能为空") @PathVariable Long projectId) { - return R.ok(iSysOaCostService.getDetail(projectId)); + return R.ok(iSysOaCostService.calcProjectDetail(projectId)); } /** diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/ClaimVO.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/ClaimVO.java new file mode 100644 index 0000000..ae759fb --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/ClaimVO.java @@ -0,0 +1,12 @@ +package com.ruoyi.oa.domain.vo; + +import lombok.Data; + +// 报销明细VO +@Data +public class ClaimVO { + private Long claimId; + private String nickName; + private Double cost; + private String remark; +} \ No newline at end of file diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/MaterialVO.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/MaterialVO.java new file mode 100644 index 0000000..28d61f5 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/MaterialVO.java @@ -0,0 +1,12 @@ +package com.ruoyi.oa.domain.vo; + +import lombok.Data; + +// 物料出库明细VO +@Data +public class MaterialVO { + private Long materialId; + private String name; + private Double price; + private Integer amount; +} \ No newline at end of file diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaCostList.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaCostList.java deleted file mode 100644 index ee0e917..0000000 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaCostList.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.ruoyi.oa.domain.vo; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class SysOaCostList { - /** - * userCostList - */ - private Long userId; - private String nickName; - private Double laborCost; - private Double attendanceNum; - - /** - * materialList - */ - private Long materialId; - private String name; - private Double price; - private Long amount; - - /** - * claimList - */ - private Long claimId; - // private String nickName; 申请人姓名 - private Double cost; - private String remark; -} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaCostRow.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaCostRow.java index eacbfdc..40e6faf 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaCostRow.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaCostRow.java @@ -6,8 +6,7 @@ import java.util.List; @Data public class SysOaCostRow { - List userCostList; - List materialList; - List claimList; - List otherList; + private List userCostList; + private List materialList; + private List claimList; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/UserCostVO.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/UserCostVO.java new file mode 100644 index 0000000..b5e143c --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/UserCostVO.java @@ -0,0 +1,12 @@ +package com.ruoyi.oa.domain.vo; + +import lombok.Data; + +// 人力成本明细VO +@Data +public class UserCostVO { + private Long userId; + private String nickName; + private Double laborCost; // 计算结果字段 + private Double attendenceNum; // 计算结果字段 +} \ No newline at end of file diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaProjectMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaProjectMapper.java index 0417a7a..6026f40 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaProjectMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaProjectMapper.java @@ -10,6 +10,7 @@ import com.ruoyi.oa.domain.SysOaOutWarehouse; import com.ruoyi.oa.domain.SysOaProject; import com.ruoyi.oa.domain.bo.SysOaProjectBo; import com.ruoyi.oa.domain.vo.SysOaCostAllVo; +import com.ruoyi.oa.domain.vo.SysOaCostRow; import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo; import com.ruoyi.oa.domain.vo.SysOaProjectVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; @@ -17,6 +18,7 @@ import org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List; +import java.util.Map; /** * 项目管理Mapper接口 @@ -37,4 +39,6 @@ public interface SysOaProjectMapper extends BaseMapperPlus selectListToCost(@Param("page") Page page,@Param(Constants.WRAPPER) QueryWrapper queryWrapper); + Map selectProjectDetails(@Param("projectId") Long projectId); + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaCostService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaCostService.java index 37ad1a9..fdfe49e 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaCostService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaCostService.java @@ -48,15 +48,6 @@ public interface ISysOaCostService { */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - /** - * 查询所有项目成本 - */ - TableDataInfo AllList(String projectName, String createTime); - - /** - * 查询详情 - */ - SysOaCostRow getDetail(Long projectId); /** @@ -68,4 +59,10 @@ public interface ISysOaCostService { */ TableDataInfo calcProjectCostList(SysOaCostBo bo, PageQuery pageQuery); + /** + * 项目成本查询详情改进 + * @param projectId + * @return + */ + SysOaCostRow calcProjectDetail(Long projectId); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaCostServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaCostServiceImpl.java index 4e54be8..2f83a89 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaCostServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaCostServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.oa.service.impl; import cn.hutool.core.bean.BeanUtil; +import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.exception.ServiceException; @@ -138,196 +139,7 @@ public class SysOaCostServiceImpl implements ISysOaCostService { return baseMapper.deleteBatchIds(ids) > 0; } - /** - * 查询所有项目成本 - */ - @Override - public TableDataInfo AllList(String projectName, String createTime) { - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(SysOaProject.class); - if (StringUtils.isNotBlank(projectName)) { - lqw.like(SysOaProject::getProjectName, projectName); - } - List projects = projectMapper.selectList(lqw); - if (projects.isEmpty()) { - return TableDataInfo.build(); - } - List sysOaCostAllVos = new ArrayList<>(); - - for (SysOaProject project : projects) { - SysOaCostAllVo sysOaCostAllVo = new SysOaCostAllVo(); - Long projectId = project.getProjectId(); - sysOaCostAllVo.setProjectId(projectId); - // 2、 查询所有项目对应的物料 - List outWarehouses = outWarehouseMapper.List(projectId); - Double materialCost = 0.0; - if (!outWarehouses.isEmpty()) { - Map warehouseMap = warehouseMapper.selectList(Wrappers.lambdaQuery(SysOaWarehouse.class)).stream().collect(Collectors.toMap(SysOaWarehouse::getId, Function.identity())); - materialCost = outWarehouses.stream().map(v -> { - Long warehouseId = v.getWarehouseId(); - BigDecimal amount = BigDecimal.valueOf(v.getAmount()); - SysOaWarehouse warehouse = warehouseMap.get(warehouseId); - if (warehouse == null) { - return BigDecimal.ZERO; - } - BigDecimal price = BigDecimal.valueOf(warehouse.getPrice()); - return amount.multiply(price); - }).reduce(BigDecimal.ZERO, BigDecimal::add).doubleValue(); - } - sysOaCostAllVo.setMaterialCost(materialCost); - // 3、 查询所有项目对应的工资费用 - LambdaQueryWrapper lqw2 = Wrappers.lambdaQuery(SysOaAttendance.class); - lqw2.eq(SysOaAttendance::getProjectId, projectId); - List attendances = attendanceMapper.selectList(lqw2); - Double userCost = 0.0; - if (!attendances.isEmpty()) { - // 分组出每个用户的天数 - Map daynumMap = attendances.stream().collect(Collectors.groupingBy( - SysOaAttendance::getUserId, - Collectors.summingDouble(attendance -> { - double attendanceDay = Optional.ofNullable(attendance.getAttendanceDay()).orElse(0L); - double dayLength = Optional.ofNullable(attendance.getDayLength()).orElse(0.0); - double hour = Optional.ofNullable(attendance.getHour()).orElse(0.0); - return (attendanceDay * dayLength * 9 + hour)/9; - }) - )); - // 获取user表中的劳务费用 - List users = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class)); - Map userMap = users.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity())); - // 计算用工总价 - userCost = attendances.stream().map(v -> { - Long userId = v.getUserId(); - SysUser user = userMap.get(userId); - if (user == null) { - return BigDecimal.ZERO; - } - Long laborCost = Optional.ofNullable(user.getLaborCost()).orElse(0L); - Double daynum = daynumMap.getOrDefault(userId, 0.0); - BigDecimal laborCostBigDecimal = BigDecimal.valueOf(laborCost); - BigDecimal daynumBigDecimal = BigDecimal.valueOf(daynum); - return laborCostBigDecimal.multiply(daynumBigDecimal); - }).reduce(BigDecimal.ZERO, BigDecimal::add).doubleValue(); - } - sysOaCostAllVo.setUserCost(userCost); - // 4、 查询所有项目对应的差旅费用 - List claims = claimMapper.List(projectId); - Double claimCost = 0.0; - if (!claims.isEmpty()) { - claimCost = claims.stream().map(v -> BigDecimal.valueOf(v.getCost())).reduce(BigDecimal.ZERO, BigDecimal::add).doubleValue(); - } - sysOaCostAllVo.setClaimCost(claimCost); - - // 5、 设置总费用 - sysOaCostAllVo.setCost(materialCost + userCost + claimCost); - // 6、 将 sysOaCostAllVo 添加到 sysOaCostAllVos 中 - sysOaCostAllVos.add(sysOaCostAllVo); - } - return TableDataInfo.build(sysOaCostAllVos); - } - - - /** - * 查询详情 - */ - @Override - public SysOaCostRow getDetail(Long projectId) { - SysOaCostRow sysOaCostRow = new SysOaCostRow(); - - List UserCostList = new ArrayList<>(); - List MaterialList = new ArrayList<>(); - List ClaimList = new ArrayList<>(); - List OtherList = new ArrayList<>(); - // 1、 查询项目信息 - SysOaProject project = projectMapper.selectById(projectId); - if (project == null) { - throw new ServiceException("项目信息不存在,项目ID: " + projectId); - } - // 2、 查询项目对应的每个人的工资详情 - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(SysOaAttendance.class); - lqw.eq(SysOaAttendance::getProjectId, projectId); - // 查询出该项目下每个用户的工作情况 - List attendances = attendanceMapper.selectList(lqw); - if (!attendances.isEmpty()) { - // 查询出该项目下每个用户的工作天数 - // 分组出每个用户的天数 - // 按用户 ID 分组,并计算每个用户的 attendance_day * day_length * 9 + hour 的总和 - Map daynumMap = attendances.stream() - .collect(Collectors.groupingBy( - SysOaAttendance::getUserId, // 按用户 ID 分组 - Collectors.summingDouble(attendance -> - (attendance.getDayLength() * 9 + attendance.getHour())/9 - ) - )); - - - List users = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class)); - Map userMap = users.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity())); - // 获取user表中的人力成本 - - // attendances 遍历,去重获取每个用户的userid - Set userIds = daynumMap.keySet(); - for (Long userId : userIds) { - SysUser user = userMap.get(userId); - if (user == null) { - continue; - } - SysOaCostList sysOaCostList = new SysOaCostList(); - double dayNum = daynumMap.get(userId) == null ? 0.0 : daynumMap.get(userId); - BigDecimal dayNumBigDecimal = new BigDecimal(dayNum); - long laborCost = user.getLaborCost() == null ? 0L : user.getLaborCost(); - sysOaCostList.setUserId(userId); - sysOaCostList.setNickName(user.getNickName()); - sysOaCostList.setLaborCost(dayNumBigDecimal.multiply(BigDecimal.valueOf(laborCost)).setScale(1, RoundingMode.HALF_UP).doubleValue()); - sysOaCostList.setAttendanceNum(dayNumBigDecimal.setScale(1, RoundingMode.HALF_UP).doubleValue()); - UserCostList.add(sysOaCostList); - } - - } - // 3、 查询项目对应的物料详情 - LambdaQueryWrapper lqw1 = Wrappers.lambdaQuery(SysOaOutWarehouse.class); - lqw1.eq(SysOaOutWarehouse::getProjectId, projectId); - List outWarehouses = outWarehouseMapper.selectList(lqw1); - //log.info("查询项目对应的物料详情:{}", outWarehouses); - if (!outWarehouses.isEmpty()) { - Map warehouseMap = warehouseMapper.selectList(Wrappers.lambdaQuery(SysOaWarehouse.class)).stream().collect(Collectors.toMap(SysOaWarehouse::getId, Function.identity())); - - //log.info("查询项目对应的物料详情:{}", warehouseMap); - for (SysOaOutWarehouse outWarehouse : outWarehouses) { - SysOaWarehouse warehouse = warehouseMap.get(outWarehouse.getWarehouseId()); - SysOaCostList sysOaCostList = new SysOaCostList(); - sysOaCostList.setMaterialId(outWarehouse.getWarehouseId()); - sysOaCostList.setName(warehouse.getName()); - sysOaCostList.setPrice(warehouse.getPrice()); - sysOaCostList.setAmount(outWarehouse.getAmount()); - MaterialList.add(sysOaCostList); - } - } - - - // 4、 查询项目对应的差旅详情 - LambdaQueryWrapper lqw2 = Wrappers.lambdaQuery(SysOaClaim.class); - lqw2.eq(SysOaClaim::getProjectId, projectId); - List claims = claimMapper.selectVoList(lqw2); - Map claimMap = claims.stream().collect(Collectors.toMap(SysOaClaimVo::getClaimId, Function.identity())); - Set claimIds = claimMap.keySet(); - if (!claims.isEmpty()) { - for (Long claimId : claimIds) { - SysOaCostList sysOaCostList = new SysOaCostList(); - SysOaClaimVo claim = claimMap.get(claimId); - sysOaCostList.setClaimId(claim.getClaimId()); - sysOaCostList.setNickName(userMapper.selectUserById(claim.getUserId()).getNickName()); - sysOaCostList.setCost(claim.getCost()); - sysOaCostList.setRemark(claim.getRemark()); - ClaimList.add(sysOaCostList); - } - } - sysOaCostRow.setUserCostList(UserCostList); - sysOaCostRow.setMaterialList(MaterialList); - sysOaCostRow.setClaimList(ClaimList); - sysOaCostRow.setOtherList(OtherList); - return sysOaCostRow; - - } @Override public TableDataInfo calcProjectCostList(SysOaCostBo bo, PageQuery pageQuery) { @@ -339,4 +151,14 @@ public class SysOaCostServiceImpl implements ISysOaCostService { // 查询user laborCost 查attendance 拿签到 return TableDataInfo.build(sysOaCostAllVos); } + + /** + * 项目成本查询详情改进 + */ + @Override + public SysOaCostRow calcProjectDetail(Long projectId) { + Map result = projectMapper.selectProjectDetails(projectId); + String jsonData = (String) result.get("data"); + return JSON.parseObject(jsonData, SysOaCostRow.class); + } } diff --git a/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml index 5ee270f..b9e3fa0 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml @@ -150,4 +150,76 @@ + + +