diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index 82aa639..1cffffb 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -148,6 +148,7 @@ public class SysUser extends BaseEntity { private Long laborCost; + @TableField(exist = false) private Double workTime; 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 92dd0be..519def0 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 @@ -99,22 +99,35 @@ public class SysOaCostController extends BaseController { - /** +// /** +// * 查询所有项目成本 +// */ +// @SaCheckPermission("oa:oaCost:list") +// @GetMapping("/list") +// public TableDataInfo AllList(@RequestParam(required = false) String projectName) { +// return iSysOaCostService.AllList(projectName); +// } + + /** * 查询所有项目成本 */ @SaCheckPermission("oa:oaCost:list") @GetMapping("/list") - public TableDataInfo AllList(@RequestParam(required = false) String projectName, @RequestParam(required = false)String createTime) { - return iSysOaCostService.AllList(projectName, createTime); + public TableDataInfo AllList(SysOaCostBo bo,PageQuery pageQuery) { + return iSysOaCostService.calcProjectCostList(bo,pageQuery); } + + + + /** * 查询详情 */ - @SaCheckPermission("oa:oaCost:list") + @SaCheckPermission("oa:oaCost:query") @GetMapping("/{projectId}") - public TableDataInfo getDetail(@NotNull(message = "项目id不能为空") + public R getDetail(@NotNull(message = "项目id不能为空") @PathVariable Long projectId) { - return iSysOaCostService.getDetail(projectId); + return R.ok(iSysOaCostService.getDetail(projectId)); } /** diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaCostBo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaCostBo.java index c223862..604e451 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaCostBo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/bo/SysOaCostBo.java @@ -69,5 +69,10 @@ public class SysOaCostBo extends BaseEntity { */ private Long claimId; + /** + * 项目名称 + */ + private String projectName; + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaCostAllVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaCostAllVo.java index 0993f33..0ce05a0 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaCostAllVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/SysOaCostAllVo.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.Date; @@ -12,6 +13,7 @@ import java.util.Date; */ @Data @AllArgsConstructor +@NoArgsConstructor public class SysOaCostAllVo { private Long projectId; @@ -41,4 +43,6 @@ public class SysOaCostAllVo { private Long financeId; + private Double peopleDay; + } 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 index 610d0b2..ee0e917 100644 --- 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 @@ -8,13 +8,27 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class SysOaCostList { - private Long costId; - private Double cost; + /** + * userCostList + */ private Long userId; - private Object userVo; + private String nickName; + private Double laborCost; + private Double attendanceNum; + + /** + * materialList + */ private Long materialId; - private Object materialVo; + private String name; + private Double price; + private Long amount; + + /** + * claimList + */ private Long claimId; - private Object claimVo; - private Integer costType; + // private String nickName; 申请人姓名 + private Double cost; + private String remark; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaClaimMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaClaimMapper.java index 3ccdad4..fccd0be 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaClaimMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaClaimMapper.java @@ -7,8 +7,10 @@ import com.ruoyi.oa.domain.SysOaClaim; import com.ruoyi.oa.domain.vo.SysOaClaimVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import javax.validation.constraints.NotNull; +import java.util.List; /** * 差旅费报销Mapper接口 @@ -25,4 +27,7 @@ public interface SysOaClaimMapper extends BaseMapperPlus List(@Param("projectId") Long projectId); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaOutWarehouseMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaOutWarehouseMapper.java index a0cf2f9..8f7858d 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaOutWarehouseMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/SysOaOutWarehouseMapper.java @@ -29,4 +29,8 @@ public interface SysOaOutWarehouseMapper extends BaseMapperPlus List(@Param("projectId") Long projectId); } 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 e40a5fc..0417a7a 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 @@ -4,9 +4,12 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysUser; 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.SysOaOutWarehouseListVo; import com.ruoyi.oa.domain.vo.SysOaProjectVo; import com.ruoyi.common.core.mapper.BaseMapperPlus; @@ -31,4 +34,7 @@ public interface SysOaProjectMapper extends BaseMapperPlus getProjectDataByMonthAndDate(@Param("firstDay") Date firstDay, @Param("lastDay") Date lastDay); + + Page selectListToCost(@Param("page") Page page,@Param(Constants.WRAPPER) QueryWrapper queryWrapper); + } 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 077a4d8..37ad1a9 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 @@ -7,7 +7,6 @@ import com.ruoyi.oa.domain.bo.SysOaCostBo; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.PageQuery; -import javax.validation.constraints.NotNull; import java.util.Collection; import java.util.List; @@ -57,8 +56,16 @@ public interface ISysOaCostService { /** * 查询详情 */ - TableDataInfo getDetail(Long projectId); + SysOaCostRow getDetail(Long projectId); + /** + * 项目成本分析改进 + * + * @param bo + * @param pageQuery + * @return + */ + TableDataInfo calcProjectCostList(SysOaCostBo bo, PageQuery pageQuery); } 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 09d9168..4e54be8 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.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; @@ -9,20 +10,21 @@ import com.ruoyi.common.core.domain.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.ruoyi.oa.domain.SysOaAttendance; -import com.ruoyi.oa.domain.SysOaProject; +import com.ruoyi.oa.domain.*; +import com.ruoyi.oa.domain.bo.SysOaProjectBo; import com.ruoyi.oa.domain.vo.*; import com.ruoyi.oa.mapper.*; import com.ruoyi.system.mapper.SysUserMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import com.ruoyi.oa.domain.bo.SysOaCostBo; -import com.ruoyi.oa.domain.SysOaCost; import com.ruoyi.oa.service.ISysOaCostService; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -44,8 +46,11 @@ public class SysOaCostServiceImpl implements ISysOaCostService { private final SysOaWarehouseMapper warehouseMapper; + private final SysOaOutWarehouseMapper outWarehouseMapper; + private final SysOaAttendanceMapper attendanceMapper; + private final SysOaProjectMapper projectMapper; /** * 查询项目成本分析 @@ -138,120 +143,200 @@ public class SysOaCostServiceImpl implements ISysOaCostService { */ @Override - public TableDataInfo AllList(String projectName, String createTime) { // 包括每个项目的成本分析,每个都有这几种类型,即每个项目返回几列数据 - - - List alls = baseMapper.AllList(projectName,createTime); - log.info("alls:{}",alls); - List allVos = new java.util.ArrayList<>(Collections.emptyList()); - if (alls.isEmpty()) return TableDataInfo.build(allVos); - for (SysOaCostAll all : alls) { - SysOaCostAllVo allVo = BeanUtil.toBean(all, SysOaCostAllVo.class); - log.info("allVo:{}", allVo); - - if (allVo.getCostType() == null) allVo.setCost(0.0); - // 车间用工 - else {if (allVo.getCostType() == 1) { //根据出勤,计算人天数 - Double days = attendanceMapper.getAttendanceDay(allVo.getUserId(), allVo.getProjectId()); - Long laborCost = userMapper.selectUserById(allVo.getUserId()).getLaborCost(); - if (days == null || laborCost == null) allVo.setUserCost(0.0); - else allVo.setUserCost(days * laborCost); - } else if (allVo.getCostType() == 2) { // 差旅花费 差旅花费 = 该项目下的所有差旅费用 - allVo.setClaimCost(claimMapper.getClaimCost(allVo.getClaimId())); - - } else if (allVo.getCostType() == 3) { // 库房物料 物料花费 =物料价格*数量 - SysOaWarehouseVo warehouseVo = warehouseMapper.selectVoById(allVo.getMaterialId()); - if (warehouseVo == null) allVo.setMaterialCost(0.0); - else allVo.setMaterialCost(warehouseVo.getInventory() * warehouseVo.getPrice()); - - } else if (allVo.getCostType() == 4) { // 其他 - - - } else if (allVo.getCostType() == 5) { // 接待 - - }} - allVos.add(allVo); - + 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<>(); -// 假设原始数据列表为 allVos - List resVos = allVos.stream() - .collect(Collectors.groupingBy(SysOaCostAllVo::getProjectId)) - .values().stream() - .map(group -> { - Double userCostSum = group.stream().mapToDouble(x -> Optional.ofNullable((Double)x.getUserCost()).orElse(0.0)).sum(); + 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); - Double claimCostSum = group.stream().mapToDouble(x -> Optional.ofNullable((Double)x.getUserCost()).orElse(0.0)).sum(); - Double materialCostSum = group.stream().mapToDouble(x -> Optional.ofNullable((Double)x.getUserCost()).orElse(0.0)).sum(); - Double totalCost = userCostSum + claimCostSum + materialCostSum; - - return new SysOaCostAllVo( - group.get(0).getProjectId(), - group.get(0).getProjectName(), - totalCost, - null, - "汇总数据", // 备注 - null, - null, // materialId - materialCostSum, - null, // userId - userCostSum, - null, // claimId - claimCostSum, - null// financeId - ); - }) - .collect(Collectors.toList()); - - - return TableDataInfo.build(resVos); + // 5、 设置总费用 + sysOaCostAllVo.setCost(materialCost + userCost + claimCost); + // 6、 将 sysOaCostAllVo 添加到 sysOaCostAllVos 中 + sysOaCostAllVos.add(sysOaCostAllVo); + } + return TableDataInfo.build(sysOaCostAllVos); } + /** * 查询详情 */ @Override - public TableDataInfo getDetail(Long projectId) { -// log.info("查询projectId = {}", projectId); -// LambdaQueryWrapper lqw = Wrappers.lambdaQuery(SysOaCost.class); -// lqw.eq(SysOaCost::getProjectId,projectId); -// List costs = baseMapper.selectList(lqw); - List costs = baseMapper.getListByProjectId(projectId); -// log.info("查询costs = {}", costs); - - if (costs.isEmpty()) { - return TableDataInfo.build(); - } + public SysOaCostRow getDetail(Long projectId) { SysOaCostRow sysOaCostRow = new SysOaCostRow(); - sysOaCostRow.setUserCostList(new ArrayList<>()); - sysOaCostRow.setMaterialList(new ArrayList<>()); - sysOaCostRow.setClaimList(new ArrayList<>()); - sysOaCostRow.setOtherList(new ArrayList<>()); - for(SysOaCost cost : costs) { - SysOaCostList sysOaCostList = BeanUtil.toBean(cost,SysOaCostList.class); - log.info("查询cost = {}", cost); - log.info("sysOaCostList = {}", sysOaCostList); - if(cost.getCostType() == 1) { -// log.info("查询useVo = {}", userMapper.selectUserById(cost.getUserId())); - sysOaCostList.setUserVo(userMapper.selectUserById(cost.getUserId())); - sysOaCostRow.getUserCostList().add(sysOaCostList); - } else if(cost.getCostType() == 2) { -// log.info("查询claimMapperVo = {}", claimMapper.selectSysOaClaimVoById(cost.getClaimId())); - sysOaCostList.setClaimVo(claimMapper.selectSysOaClaimVoById(cost.getClaimId())); - sysOaCostRow.getClaimList().add(sysOaCostList); - } else if(cost.getCostType() == 3) { -// log.info("查询warehouseMapperVo = {}",warehouseMapper.selectVoById(cost.getMaterialId())); - sysOaCostList.setMaterialVo(warehouseMapper.selectVoById(cost.getMaterialId())); - sysOaCostRow.getMaterialList().add(sysOaCostList); - } else{ - sysOaCostRow.getOtherList().add(sysOaCostList); + 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); } } -// log.info("sysOaCostRow = {}", sysOaCostRow); - List rows = new java.util.ArrayList<>(Collections.singletonList(sysOaCostRow)); - return TableDataInfo.build(rows); + // 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) { + // 查询所有的项目拿到项目之后分别计算他们的各种成本联查四表 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like(bo.getProjectName()!=null,"sop.project_name", bo.getProjectName()); + queryWrapper.orderByDesc("sop.create_time"); + Page sysOaCostAllVos = projectMapper.selectListToCost(pageQuery.build(),queryWrapper); + // 查询user laborCost 查attendance 拿签到 + return TableDataInfo.build(sysOaCostAllVos); + } } diff --git a/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml index 938ee35..5ee270f 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/SysOaProjectMapper.xml @@ -115,6 +115,39 @@ and soa.del_flag = '0' group by sop.project_id,create_time + diff --git a/ruoyi-oa/src/main/resources/mapper/oa/SysOaWarehouseMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/SysOaWarehouseMapper.xml index e804890..ae51a58 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/SysOaWarehouseMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/SysOaWarehouseMapper.xml @@ -22,7 +22,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" diff --git a/ruoyi-ui/src/api/oa/finance.js b/ruoyi-ui/src/api/oa/finance.js index 901e1c5..7d6a376 100644 --- a/ruoyi-ui/src/api/oa/finance.js +++ b/ruoyi-ui/src/api/oa/finance.js @@ -95,13 +95,14 @@ export function delFinance(financeId) { } /** - * + * * @returns 获取进出账管理列表 */ -export function getCostDetailList() { +export function getCostDetailList(query) { return request({ url: '/oa/cost/list', - method: 'get' + method: 'get', + params:query }) } @@ -117,9 +118,9 @@ export function getCostDetailById(costId) { } /** - * + * * @param {*} data 创建成本详情 - * @returns + * @returns */ export function createCostDetail(data) { return request({ @@ -130,13 +131,13 @@ export function createCostDetail(data) { } /** - * + * * @param {*} costId 删除成本详情 - * @returns + * @returns */ export function deleteCostDetail(costId) { return request({ url: `/oa/cost/${costId}`, method: 'delete' }) -} \ No newline at end of file +} diff --git a/ruoyi-ui/src/utils/currencyFormatter.js b/ruoyi-ui/src/utils/currencyFormatter.js index aa365f7..280235b 100644 --- a/ruoyi-ui/src/utils/currencyFormatter.js +++ b/ruoyi-ui/src/utils/currencyFormatter.js @@ -106,3 +106,11 @@ export function numberToCNY(money) { } return chineseStr; } + + +export function formatNumberToWan(num) { + if (num === 0) return 0; + const wanNum = num / 10000; + const roundedNum = Math.round(wanNum * 100) / 100; // 保留两位小数,四舍五入 + return roundedNum; +} diff --git a/ruoyi-ui/src/views/oa/finance-detail/index.vue b/ruoyi-ui/src/views/oa/finance-detail/index.vue index 6212f05..dde9af9 100644 --- a/ruoyi-ui/src/views/oa/finance-detail/index.vue +++ b/ruoyi-ui/src/views/oa/finance-detail/index.vue @@ -1,83 +1,49 @@