8-6 根据项目id查询其相关预算汇总

This commit is contained in:
郝彬 2025-08-06 09:44:22 +08:00
parent a49d01d23a
commit 8c7a441662
13 changed files with 190 additions and 187 deletions

View File

@ -30,7 +30,7 @@ public class ProjectBudgetInfoEntity extends AuditableEntity implements Serializ
@ExcelProperty("主键")
@ApiModelProperty("主键")
@TableId(value = "budget_id", type = IdType.ASSIGN_ID)
@TableId(value = "budget_id", type = IdType.AUTO)
private String budgetId;
@ExcelProperty("项目id")
@ -43,13 +43,8 @@ public class ProjectBudgetInfoEntity extends AuditableEntity implements Serializ
@TableField("budget_name")
private String budgetName;
@ExcelProperty("预算类型")
@ApiModelProperty("预算类型")
@TableField("budget_type")
private String budgetType;
@ExcelProperty("预算金额(万元)")
@ApiModelProperty("预算金额(万元)")
@ExcelProperty("预算花费金额")
@ApiModelProperty("预算花费金额")
@TableField("budget_amount")
private Double budgetAmount;
@ -57,5 +52,10 @@ public class ProjectBudgetInfoEntity extends AuditableEntity implements Serializ
@ApiModelProperty("预算说明")
@TableField("budget_desc")
private String budgetDesc;
@ExcelProperty("附件")
@ApiModelProperty("附件")
@TableField("attach")
private String attach;
}

View File

@ -171,5 +171,35 @@ public class ProjectEntity extends AuditableEntity implements Serializable {
@ApiModelProperty(value = "结束时间")
private LocalDate endDate;
@ApiModelProperty("人工成本")
private Double laborCost;
@ApiModelProperty("设备摊销")
private Double equipmentAmortization;
@ApiModelProperty("奖金预提")
private Double bonusProvision;
@ApiModelProperty("交通食宿")
private Double transAccomMeals;
@ApiModelProperty("其他杂费")
private Double othersCost;
@ApiModelProperty("已用人工成本")
private Double useLaborCost;
@ApiModelProperty("已用设备摊销")
private Double useEquipmentAmortization;
@ApiModelProperty("已用奖金预提")
private Double useBonusProvision;
@ApiModelProperty("已用交通食宿")
private Double useTransAccomMeals;
@ApiModelProperty("已用其他杂费")
private Double useOthersCost;
}

View File

@ -0,0 +1,58 @@
package com.dite.znpt.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
@ApiModel("项目预算信息详情")
public class ProjectBudgetInfoDetailResp implements Serializable {
@Serial
private static final long serialVersionUID = 766154886845694269L;
@ApiModelProperty("项目id")
private String projectId;
@ApiModelProperty("项目名称")
private String projectName;
@ApiModelProperty("项目预算")
private Double projectBudget;
@ApiModelProperty("人工成本")
private Double laborCost;
@ApiModelProperty("设备摊销")
private Double equipmentAmortization;
@ApiModelProperty("奖金预提")
private Double bonusProvision;
@ApiModelProperty("交通食宿")
private Double transAccomMeals;
@ApiModelProperty("其他杂费")
private Double othersCost;
@ApiModelProperty("已用人工成本")
private Double useLaborCost;
@ApiModelProperty("已用设备摊销")
private Double useEquipmentAmortization;
@ApiModelProperty("已用奖金预提")
private Double useBonusProvision;
@ApiModelProperty("已用交通食宿")
private Double useTransAccomMeals;
@ApiModelProperty("已用其他杂费")
private Double useOthersCost;
@ApiModelProperty("剩余预算")
private Double restBudget;
}

View File

@ -20,19 +20,18 @@ public class ProjectBudgetInfoImportReq implements Serializable {
@Serial
private static final long serialVersionUID = 580212651388155611L;
@ExcelProperty(value = "项目名称")
private String projectName;
@ExcelProperty(value = "项目Id")
private String projectId;
@ExcelProperty(value = "预算名称")
private String budgetName;
@ExcelProperty(value = "预算类型")
private String budgetType;
@ExcelProperty(value = "预算金额(万元)")
@ExcelProperty(value = "预算花费金额")
private Double budgetAmount;
@ExcelProperty(value = "预算说明")
private String budgetDesc;
@ExcelProperty(value = "附件")
private String attach;
}

View File

@ -22,7 +22,7 @@ public class ProjectBudgetInfoListReq implements Serializable {
@ApiModelProperty("查询关键字")
private String keyword;
@ApiModelProperty("项目预算信息Id")
@ApiModelProperty("项目预算Id")
private String budgetId;
@ApiModelProperty("项目id")
@ -31,14 +31,10 @@ public class ProjectBudgetInfoListReq implements Serializable {
@ApiModelProperty("预算名称")
private String budgetName;
@ApiModelProperty("预算类型")
private String budgetType;
@ApiModelProperty("预算金额(万元)")
@ApiModelProperty("预算花费金额")
private Double budgetAmount;
@ApiModelProperty("预算说明")
private String budgetDesc;
}

View File

@ -2,6 +2,7 @@ package com.dite.znpt.domain.vo;
import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -14,6 +15,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@ApiModel("项目预算信息列表响应实体")
public class ProjectBudgetInfoListResp extends ProjectBudgetInfoEntity {
@ApiModelProperty("项目名称")
private String projectName;
}

View File

@ -26,16 +26,13 @@ public class ProjectBudgetInfoReq implements Serializable {
@ApiModelProperty("预算名称")
private String budgetName;
@ApiModelProperty("预算类型")
private String budgetType;
@ApiModelProperty("预算金额(万元)")
@ApiModelProperty("预算花费金额")
private Double budgetAmount;
@ApiModelProperty("预算说明")
private String budgetDesc;
@ApiModelProperty("附件id")
private String attachId;
@ApiModelProperty("附件")
private String attach;
}

View File

@ -15,8 +15,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@ApiModel("项目预算信息响应实体")
public class ProjectBudgetInfoResp extends ProjectBudgetInfoEntity {
@ApiModelProperty("预算类型描述")
private String budgetTypeDesc;
@ApiModelProperty("项目名称")
private String projectName;
}

View File

@ -2,10 +2,8 @@ package com.dite.znpt.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity;
import com.dite.znpt.domain.vo.ProjectBudgetInfoListReq;
import com.dite.znpt.domain.vo.ProjectBudgetInfoListResp;
import com.dite.znpt.domain.vo.ProjectBudgetInfoReq;
import com.dite.znpt.domain.vo.ProjectBudgetInfoResp;
import com.dite.znpt.domain.vo.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@ -15,34 +13,14 @@ import java.util.List;
* @Description: 项目预算信息表服务接口
*/
public interface ProjectBudgetInfoService extends IService<ProjectBudgetInfoEntity> {
List<ProjectBudgetInfoListResp> list(ProjectBudgetInfoListReq projectBudgetInfoListReq);
/**
* 功能描述查询项目预算信息列表
*
* @param projectBudgetInfoReq 项目预算信息
* @return {@link List }<{@link ProjectBudgetInfoListResp }>
* @author huise23
* @date 2025/07/17 21:58
**/
List<ProjectBudgetInfoListResp> selectList(ProjectBudgetInfoListReq projectBudgetInfoReq);
List<ProjectBudgetInfoListResp> page(ProjectBudgetInfoListReq projectBudgetInfoListReq);
/**
* 功能描述根据项目id获取项目预算信息列表
*
* @param projectId 项目id
* @return {@link List }<{@link ProjectBudgetInfoListResp }>
* @author huise23
* @date 2025/07/17 21:58
**/
List<ProjectBudgetInfoResp> detailByProjectId(String projectId);
void saveData(ProjectBudgetInfoImportReq req);
/**
* 功能描述新增项目预算信息
*
* @param projectBudgetInfoReq 项目预算信息
* @author huise23
* @date 2025/07/17 21:58
**/
void saveData(List<ProjectBudgetInfoReq> projectBudgetInfoReq);
void saveData(ProjectBudgetInfoImportReq req, MultipartFile[] files);
ProjectBudgetInfoDetailResp detailByProjectId(String projectId);
}

View File

@ -1,25 +1,21 @@
package com.dite.znpt.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity;
import com.dite.znpt.domain.vo.ProjectBudgetInfoListReq;
import com.dite.znpt.domain.vo.ProjectBudgetInfoListResp;
import com.dite.znpt.domain.vo.ProjectBudgetInfoReq;
import com.dite.znpt.domain.vo.ProjectBudgetInfoResp;
import com.dite.znpt.enums.AttachBusinessTypeEnum;
import com.dite.znpt.enums.BudgeTypeEnum;
import com.dite.znpt.domain.entity.ProjectEntity;
import com.dite.znpt.domain.vo.*;
import com.dite.znpt.mapper.ProjectBudgetInfoMapper;
import com.dite.znpt.service.AttachInfoService;
import com.dite.znpt.service.ProjectBudgetInfoService;
import com.dite.znpt.service.ProjectService;
import com.dite.znpt.util.PageUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
/**
@ -30,63 +26,49 @@ import java.util.List;
@Service
@RequiredArgsConstructor
public class ProjectBudgetInfoServiceImpl extends ServiceImpl<ProjectBudgetInfoMapper, ProjectBudgetInfoEntity> implements ProjectBudgetInfoService {
@Resource
ProjectService projectService;
private final AttachInfoService attachInfoService;
@Resource
AttachInfoServiceImpl attachInfoService;
/**
* 功能描述查询项目预算信息列表
*
* @param projectBudgetInfoReq 项目预算信息信息
* @return {@link List }<{@link ProjectBudgetInfoResp }>
* @author huise23
* @date 2025/07/17 21:58
**/
@Override
public List<ProjectBudgetInfoListResp> selectList(ProjectBudgetInfoListReq projectBudgetInfoReq) {
PageUtil.startPage();
List<ProjectBudgetInfoListResp> projectBudgetInfoList= this.baseMapper.queryBySelective(projectBudgetInfoReq);
projectBudgetInfoList.forEach(resp -> {
});
return projectBudgetInfoList;
}
/**
* 功能描述根据项目id获取项目预算信息列表
*
* @param projectId 项目id
* @return {@link List }<{@link ProjectBudgetInfoListResp }>
* @author huise23
* @date 2025/07/17 21:58
**/
@Override
public List<ProjectBudgetInfoResp> detailByProjectId(String projectId) {
List<ProjectBudgetInfoResp> projectBudgetInfoList= this.baseMapper.detailByProjectId(projectId);
projectBudgetInfoList.forEach(resp -> {
resp.setBudgetTypeDesc(BudgeTypeEnum.getDescByCode(resp.getBudgetType()));
});
return projectBudgetInfoList;
}
/**
* 功能描述新增项目预算信息
*
* @param projectBudgetInfoReq 项目预算信息
* @author huise23
* @date 2025/07/17 21:58
**/
@Override
@Transactional(rollbackFor = Exception.class)
public void saveData(List<ProjectBudgetInfoReq> projectBudgetInfoReq) {
List<ProjectBudgetInfoEntity> list = new ArrayList<>();
for (ProjectBudgetInfoReq req : projectBudgetInfoReq) {
ProjectBudgetInfoEntity info = BeanUtil.copyProperties(req, ProjectBudgetInfoEntity.class);
info.setBudgetId(IdUtil.simpleUUID());
attachInfoService.updateBusinessIdByAttachIds(info.getBudgetId(), ListUtil.of(req.getAttachId()), AttachBusinessTypeEnum.PROJECT_BUDGE);
list.add(info);
public List<ProjectBudgetInfoListResp> list(ProjectBudgetInfoListReq req) {
List<ProjectBudgetInfoListResp> list = this.baseMapper.queryBySelective(req);
if (CollectionUtil.isEmpty(list)) {
return Collections.emptyList(); // 返回不可修改的空集合
}
lambdaUpdate().eq(ProjectBudgetInfoEntity::getProjectId, list.get(0).getProjectId()).remove();
baseMapper.insert(list);
list.forEach(item -> {
item.setProjectName(projectService.getById(item.getProjectId()).getProjectName());
});
return list;
}
@Override
public List<ProjectBudgetInfoListResp> page(ProjectBudgetInfoListReq req) {
PageUtil.startPage();
return this.list(req);
}
@Override
public void saveData(ProjectBudgetInfoImportReq req) {
ProjectBudgetInfoEntity entity = BeanUtil.copyProperties(req, ProjectBudgetInfoEntity.class);
this.baseMapper.insert(entity);
}
@Override
public void saveData(ProjectBudgetInfoImportReq req, MultipartFile[] files) {
ProjectBudgetInfoEntity entity = BeanUtil.copyProperties(req, ProjectBudgetInfoEntity.class);
// 把附件存起来使用已有的附件上传逻辑就行但我看不懂pass
this.baseMapper.insert(entity);
}
@Override
public ProjectBudgetInfoDetailResp detailByProjectId(String projectId) {
ProjectEntity projectEntity = projectService.getById(projectId);
ProjectBudgetInfoDetailResp resp = new ProjectBudgetInfoDetailResp();
BeanUtil.copyProperties(projectEntity, resp);
resp.setRestBudget(resp.getProjectBudget() - resp.getUseLaborCost() - resp.getUseEquipmentAmortization() - resp.getUseBonusProvision() - resp.getUseTransAccomMeals() - resp.getUseOthersCost());
return resp;
}
}

View File

@ -3,47 +3,24 @@
<mapper namespace="com.dite.znpt.mapper.ProjectBudgetInfoMapper">
<sql id="Base_Column_List">
a.budget_id, a.project_id, a.budget_name, a.budget_type,
a.budget_amount, a.budget_desc, a.update_by, a.create_time,
a.create_by, a.update_time
a.budget_id, a.project_id, a.budget_name,
a.budget_amount, a.budget_desc, a.attach
</sql>
<select id="queryBySelective" resultType="com.dite.znpt.domain.vo.ProjectBudgetInfoListResp">
select
<include refid="Base_Column_List"/>, p.*
<include refid="Base_Column_List"/>, p.*
from project_budget_info a
left join project p on a.project_id = p.project_id
<where>
<if test="budgetId != null and budgetId != ''">
and a.budget_id like concat ('%', #{budgetId}, '%')
</if>
<if test="projectId != null and projectId != ''">
and a.project_id like concat ('%', #{projectId}, '%')
and a.project_id = #{projectId}
</if>
<if test="budgetName != null and budgetName != ''">
and a.budget_name like concat ('%', #{budgetName}, '%')
</if>
<if test="budgetType != null and budgetType != ''">
and a.budget_type like concat ('%', #{budgetType}, '%')
</if>
<if test="budgetAmount != null">
and a.budget_amount = #{budgetAmount}
</if>
<if test="budgetDesc != null and budgetDesc != ''">
and a.budget_desc like concat ('%', #{budgetDesc}, '%')
</if>
</where>
</select>
<select id="detailByProjectId" resultType="com.dite.znpt.domain.vo.ProjectBudgetInfoResp">
select
<include refid="Base_Column_List"/>
from project_budget_info a
<where>
<if test="_parameter != null and _parameter != ''">
and a.project_id like concat ('%', #{projectId}, '%')
and a.budget_name = #{budgetName}
</if>
</where>
order by a.project_id, a.budget_name
</select>
</mapper>

View File

@ -1,18 +0,0 @@
package com.dite.znpt.web.controller;
import com.dite.znpt.service.ProjectService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@Api(tags = "预算管理")
@RestController("/budget")
public class BudgetController {
@Resource
private ProjectService projectService;
}

View File

@ -3,10 +3,7 @@ package com.dite.znpt.web.controller;
import com.dite.znpt.domain.PageResult;
import com.dite.znpt.domain.Result;
import com.dite.znpt.domain.vo.ProjectBudgetInfoListReq;
import com.dite.znpt.domain.vo.ProjectBudgetInfoListResp;
import com.dite.znpt.domain.vo.ProjectBudgetInfoReq;
import com.dite.znpt.domain.vo.ProjectBudgetInfoResp;
import com.dite.znpt.domain.vo.*;
import com.dite.znpt.service.ProjectBudgetInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -26,23 +23,29 @@ public class ProjectBudgetInfoController {
@Resource
private ProjectBudgetInfoService projectBudgetInfoService;
@ApiOperation(value = "获取项目预算信息列表", httpMethod = "GET")
@ApiOperation(value = "筛选项目预算信息列表", httpMethod = "GET")
@GetMapping("/list")
public PageResult<ProjectBudgetInfoListResp> list(ProjectBudgetInfoListReq projectBudgetInfoReq) {
return PageResult.ok(projectBudgetInfoService.selectList(projectBudgetInfoReq));
public Result<List<ProjectBudgetInfoListResp>> list(ProjectBudgetInfoListReq projectBudgetInfoListReq) {
return Result.ok(projectBudgetInfoService.list(projectBudgetInfoListReq));
}
@ApiOperation(value = "根据项目id获取项目预算信息列表", httpMethod = "GET")
@GetMapping("/detail/{projectId}")
public PageResult<ProjectBudgetInfoResp> detailByProjectId(@PathVariable String projectId) {
return PageResult.ok(projectBudgetInfoService.detailByProjectId(projectId));
@ApiOperation(value = "分页筛选项目预算信息列表", httpMethod = "GET")
@GetMapping("/page")
public PageResult<ProjectBudgetInfoListResp> page(ProjectBudgetInfoListReq projectBudgetInfoListReq) {
return PageResult.ok(projectBudgetInfoService.page(projectBudgetInfoListReq));
}
@ApiOperation(value = "保存项目预算信息", httpMethod = "POST")
@PostMapping
public Result<Object> add(@RequestBody List<ProjectBudgetInfoReq> projectBudgetInfoReq) {
projectBudgetInfoService.saveData(projectBudgetInfoReq);
@ApiOperation(value = "新增项目预算信息", httpMethod = "POST")
@PostMapping("/save")
public Result<Void> save(@RequestBody ProjectBudgetInfoImportReq req) {
projectBudgetInfoService.saveData(req);
return Result.ok();
}
@ApiOperation(value = "项目预算信息详情", httpMethod = "GET")
@GetMapping("/{projectId}/detail")
public Result<ProjectBudgetInfoDetailResp> detail(@PathVariable String projectId) {
return Result.ok(projectBudgetInfoService.detailByProjectId(projectId));
}
}