diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/controller/AmountApprovalController.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/controller/AmountApprovalController.java
new file mode 100644
index 0000000..cb91c79
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/controller/AmountApprovalController.java
@@ -0,0 +1,52 @@
+package com.hz.pm.api.projectlib.controller;
+
+import com.hz.pm.api.projectlib.manage.AmountApprovalManage;
+import com.hz.pm.api.projectlib.model.req.ProjectListReq;
+import com.hz.pm.api.projectlib.model.req.SubmitAmountApprovalReq;
+import com.hz.pm.api.projectlib.model.vo.AmountApprovalProgressStatisticsVO;
+import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO;
+import com.ningdatech.basic.model.PageVo;
+import com.ningdatech.log.annotation.WebLog;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ *
+ * AmountApprovalController
+ *
+ *
+ * @author WendyYang
+ * @since 17:08 2024/9/4
+ */
+@Api(tags = "资金下达控制器")
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/v1/amountApproval")
+public class AmountApprovalController {
+
+ private final AmountApprovalManage amountApprovalManage;
+
+ @GetMapping("/page")
+ @ApiOperation("分页查询")
+ public PageVo page(ProjectListReq req) {
+ return amountApprovalManage.page(req);
+ }
+
+ @GetMapping("progressStatistics")
+ @ApiOperation("资金下达进度统计")
+ public AmountApprovalProgressStatisticsVO progressStatistics(ProjectListReq req) {
+ return amountApprovalManage.progressStatistics(req);
+ }
+
+ @PostMapping("/submit")
+ @ApiOperation("资金下达")
+ @WebLog("资金下达")
+ public void submit(@RequestBody @Valid SubmitAmountApprovalReq req) {
+ amountApprovalManage.submitAmountApproval(req);
+ }
+
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/AmountApprovalManage.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/AmountApprovalManage.java
new file mode 100644
index 0000000..4256902
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/AmountApprovalManage.java
@@ -0,0 +1,173 @@
+package com.hz.pm.api.projectlib.manage;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.NumberUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hz.pm.api.common.helper.UserInfoHelper;
+import com.hz.pm.api.datascope.model.DataScopeDTO;
+import com.hz.pm.api.datascope.utils.DataScopeUtil;
+import com.hz.pm.api.projectlib.helper.ProjectManageUtil;
+import com.hz.pm.api.projectlib.model.entity.Project;
+import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus;
+import com.hz.pm.api.projectlib.model.req.ProjectListReq;
+import com.hz.pm.api.projectlib.model.req.SubmitAmountApprovalReq;
+import com.hz.pm.api.projectlib.model.vo.AmountApprovalProgressStatisticsVO;
+import com.hz.pm.api.projectlib.model.vo.AnnualPlanListItemVO;
+import com.hz.pm.api.projectlib.model.vo.AnnualPlanProgressStatisticsVO;
+import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO;
+import com.hz.pm.api.projectlib.service.IProjectService;
+import com.hz.pm.api.user.helper.MhUnitCache;
+import com.hz.pm.api.user.security.model.UserFullInfoDTO;
+import com.hz.pm.api.user.util.LoginUserUtil;
+import com.ningdatech.basic.model.PageVo;
+import com.ningdatech.basic.util.CollUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ *
+ * AmountApprovalManage
+ *
+ *
+ * @author WendyYang
+ * @since 17:10 2024/9/4
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class AmountApprovalManage {
+
+ private final IProjectService projectService;
+ private final UserInfoHelper userInfoHelper;
+ private final MhUnitCache mhUnitCache;
+
+
+ private boolean projectQueryPermission(LambdaQueryWrapper query, UserFullInfoDTO user) {
+ boolean queryState = true;
+ Optional currDs = DataScopeUtil.getCurrentUserDataScopeHasUserId(user);
+ if (!currDs.isPresent()) {
+ log.warn("没有取到权限信息 当前查询 没有权限条件");
+ queryState = false;
+ } else {
+ switch (currDs.get().getRole()) {
+ case NORMAL_MEMBER:
+ //普通用户 只能看到自己单位去申报的
+ query.eq(Project::getBuildOrgCode, user.getMhUnitIdStr());
+ break;
+ case COMPANY_MANAGER:
+ List childUnitIds = mhUnitCache.getViewChildIdsRecursion(user.getMhUnitId());
+ List viewUnitIdList = CollUtils.convert(childUnitIds, String::valueOf);
+ //单位管理员 看到自己单位去申报的 + 待预审的主管单位是自己单位的项目
+ query.and(q1 -> q1.in(Project::getBuildOrgCode, viewUnitIdList)
+ .or(q2 -> q2.eq(Project::getStage, ProjectStatus.NOT_APPROVED.getCode())
+ .in(Project::getSuperOrgCode, viewUnitIdList)));
+ break;
+ case SUPER_ADMIN:
+ //超级管理员 看到丽水全市的 并且也要判断他 同时是不是单位管理员
+ break;
+ case VISITOR:
+ //访客可以看全市的
+ break;
+ case DASHBOARD:
+ break;
+ default:
+ //没有权限的话 就让它查不到
+ queryState = false;
+ break;
+ }
+ }
+ return queryState;
+ }
+
+ public PageVo page(ProjectListReq req) {
+ LambdaQueryWrapper query = ProjectManageUtil.initQuery();
+ UserFullInfoDTO user = userInfoHelper.getUserFullInfo(LoginUserUtil.getUserId());
+ if (!projectQueryPermission(query, user)) {
+ return PageVo.empty();
+ }
+ ProjectManageUtil.projectQuery(query, req);
+ ProjectManageUtil.projectBaseQuery(query);
+ query.eq(Project::getNewest, Boolean.TRUE)
+ .ne(Project::getStage, ProjectStatus.STOPPED.getCode());
+ if (req.getIsAmountApproval() != null) {
+ if (Boolean.TRUE.equals(req.getIsAmountApproval())) {
+ query.gt(Project::getApprovalAmount, 0)
+ .isNotNull(Project::getApprovalAmount);
+ } else {
+ query.and(q -> q.isNull(Project::getApprovalAmount)
+ .or(q1 -> q1.le(Project::getApprovalAmount, 0)));
+ }
+ }
+ Page page = projectService.page(req.page(), query);
+ long total = page.getTotal();
+ if (total == 0) {
+ return PageVo.empty();
+ }
+ List records = CollUtils.convert(page.getRecords(), w -> {
+ ProjectLibListItemVO item = new ProjectLibListItemVO();
+ item.setId(w.getId());
+ item.setProjectCode(w.getProjectCode());
+ item.setProjectName(w.getProjectName());
+ item.setStage(w.getStage());
+ item.setStatus(w.getStatus());
+ item.setProjectYear(w.getProjectYear());
+ item.setProjectType(w.getProjectType());
+ item.setDeclaredAmount(w.getDeclareAmount());
+ item.setBuildOrg(w.getBuildOrgName());
+ item.setCreateOn(w.getCreateOn());
+ item.setApprovedAmount(w.getApprovalAmount());
+ item.setReviewAmount(w.getReviewAmount());
+ return item;
+ });
+ return PageVo.of(records, total);
+ }
+
+ public AmountApprovalProgressStatisticsVO progressStatistics(ProjectListReq req) {
+ LambdaQueryWrapper query = ProjectManageUtil.initQuery();
+ UserFullInfoDTO user = userInfoHelper.getUserFullInfo(LoginUserUtil.getUserId());
+ if (!projectQueryPermission(query, user)) {
+ return null;
+ }
+ ProjectManageUtil.projectQuery(query, req);
+ ProjectManageUtil.projectBaseQuery(query);
+ query.eq(Project::getNewest, Boolean.TRUE)
+ .ne(Project::getStage, ProjectStatus.STOPPED.getCode());
+ if (req.getIsAmountApproval() != null) {
+ if (Boolean.TRUE.equals(req.getIsAmountApproval())) {
+ query.gt(Project::getApprovalAmount, 0)
+ .isNotNull(Project::getApprovalAmount);
+ } else {
+ query.and(q -> q.isNull(Project::getApprovalAmount)
+ .or(q1 -> q1.le(Project::getApprovalAmount, 0)));
+ }
+ }
+ List page = projectService.list(query);
+ AmountApprovalProgressStatisticsVO stat = new AmountApprovalProgressStatisticsVO();
+ stat.setTotalCount(page.size());
+ stat.setApprovalCount(CollUtil.count(page, w -> w.getApprovalAmount() != null
+ && NumberUtil.isGreater(w.getApprovalAmount(), BigDecimal.ZERO)));
+ stat.setUnApprovalCount(stat.getTotalCount() - stat.getApprovalCount());
+ return stat;
+ }
+
+ public void submitAmountApproval(SubmitAmountApprovalReq req) {
+ Project project = projectService.getNewestNoNull(req.getProjectId());
+ Assert.isTrue(ProjectStatus.STOPPED.eq(project.getStage()), "项目终止中");
+ LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(Project.class)
+ .set(Project::getApprovalAmountFile, req.getApprovalAmountFile())
+ .set(Project::getApprovalAmount, req.getApprovalAmount())
+ .set(Project::getReviewAmount, req.getReviewAmount())
+ .eq(Project::getId, project.getId());
+ projectService.update(wrapper);
+ }
+
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/ProjectDTO.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/ProjectDTO.java
index af072d2..31bdcd2 100644
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/ProjectDTO.java
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/ProjectDTO.java
@@ -183,6 +183,9 @@ public class ProjectDTO implements Serializable {
@ApiModelProperty("年度支付计划")
private List paymentPlanList;
+ @ApiModelProperty("资金下达附件")
+ private String approvalAmountFile;
+
@ApiModelProperty("立项批复资金(万元)")
private BigDecimal approvalAmount;
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/entity/Project.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/entity/Project.java
index d5cf841..b14532e 100644
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/entity/Project.java
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/entity/Project.java
@@ -185,6 +185,9 @@ public class Project implements Serializable {
//==================================================================================================================
+ @ApiModelProperty("资金下达附件")
+ private String approvalAmountFile;
+
@ApiModelProperty("批复-自有金额(万元)")
private BigDecimal approvalHaveAmount;
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/ProjectListReq.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/ProjectListReq.java
index 82f54cc..807967a 100644
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/ProjectListReq.java
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/ProjectListReq.java
@@ -121,6 +121,9 @@ public class ProjectListReq extends PagePo {
private Boolean isStartDeclaredProject;
+ @ApiModelProperty("是否资金已下达")
+ private Boolean isAmountApproval;
+
private Long declaredUnitId;
private List declaredUnitIds;
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/SubmitAmountApprovalReq.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/SubmitAmountApprovalReq.java
new file mode 100644
index 0000000..6f924c7
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/SubmitAmountApprovalReq.java
@@ -0,0 +1,35 @@
+package com.hz.pm.api.projectlib.model.req;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ *
+ * SubmitAmountApprovalReq
+ *
+ *
+ * @author WendyYang
+ * @since 17:28 2024/9/4
+ */
+@Data
+public class SubmitAmountApprovalReq {
+
+ @ApiModelProperty("项目ID")
+ @NotNull(message = "项目ID不能为空")
+ private Long projectId;
+
+ @ApiModelProperty("批复金额")
+ @NotNull(message = "批复金额不能为空")
+ private BigDecimal approvalAmount;
+
+ @ApiModelProperty("评审金额")
+ @NotNull(message = "评审金额不能为空")
+ private BigDecimal reviewAmount;
+
+ @ApiModelProperty("资金下达附件")
+ private String approvalAmountFile;
+
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/AmountApprovalProgressStatisticsVO.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/AmountApprovalProgressStatisticsVO.java
new file mode 100644
index 0000000..a750a8d
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/AmountApprovalProgressStatisticsVO.java
@@ -0,0 +1,26 @@
+package com.hz.pm.api.projectlib.model.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ *
+ * AmountApprovalProgressStatisticsVO
+ *
+ *
+ * @author WendyYang
+ * @since 17:01 2024/9/4
+ */
+@Data
+public class AmountApprovalProgressStatisticsVO {
+
+ @ApiModelProperty("总数量")
+ private Integer totalCount;
+
+ @ApiModelProperty("已下达资金数量")
+ private Integer approvalCount;
+
+ @ApiModelProperty("未下达资金数量")
+ private Integer unApprovalCount;
+
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/ProjectDetailVO.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/ProjectDetailVO.java
index b415ccc..6c8cfa8 100644
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/ProjectDetailVO.java
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/ProjectDetailVO.java
@@ -213,6 +213,9 @@ public class ProjectDetailVO {
@ApiModelProperty("年度支付计划-其它资金(万元)")
private BigDecimal annualPlanOtherAmount;
+ @ApiModelProperty("资金下达附件")
+ private String approvalAmountFile;
+
@ApiModelProperty("立项批复资金(万元)")
private BigDecimal approvalAmount;