@@ -56,7 +56,7 @@ public class GeneratorCodeKingbaseConfig { | |||||
} | } | ||||
public static void main(String[] args) { | public static void main(String[] args) { | ||||
generate("WendyYang", "expert", PATH_YYD, "nd_review_template_settings"); | |||||
generate("WendyYang", "projectlib", PATH_YYD, "nd_project_renewal_fund_declaration"); | |||||
} | } | ||||
} | } |
@@ -3,7 +3,6 @@ package com.ningdatech.pmapi; | |||||
import org.mybatis.spring.annotation.MapperScan; | import org.mybatis.spring.annotation.MapperScan; | ||||
import org.springframework.boot.SpringApplication; | import org.springframework.boot.SpringApplication; | ||||
import org.springframework.boot.autoconfigure.SpringBootApplication; | import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||
import org.springframework.context.annotation.ComponentScan; | |||||
import org.springframework.context.annotation.EnableAspectJAutoProxy; | import org.springframework.context.annotation.EnableAspectJAutoProxy; | ||||
import org.springframework.scheduling.annotation.EnableAsync; | import org.springframework.scheduling.annotation.EnableAsync; | ||||
import org.springframework.scheduling.annotation.EnableScheduling; | import org.springframework.scheduling.annotation.EnableScheduling; | ||||
@@ -23,7 +22,7 @@ public class App { | |||||
protected static final String MAPPER_PACKAGES = "com.ningdatech.pmapi.**.mapper"; | protected static final String MAPPER_PACKAGES = "com.ningdatech.pmapi.**.mapper"; | ||||
public static void main(String[] args) { | public static void main(String[] args) { | ||||
System.setProperty("druid.mysql.usePingMethod", "false"); | |||||
SpringApplication.run(App.class, args); | SpringApplication.run(App.class, args); | ||||
} | } | ||||
} | } |
@@ -0,0 +1,40 @@ | |||||
package com.ningdatech.pmapi.expert.controller; | |||||
import com.ningdatech.log.annotation.WebLog; | |||||
import com.ningdatech.pmapi.expert.manage.ExpertReviewManage; | |||||
import com.ningdatech.pmapi.expert.model.req.ExpertReviewDetailReq; | |||||
import io.swagger.annotations.Api; | |||||
import io.swagger.annotations.ApiOperation; | |||||
import lombok.AllArgsConstructor; | |||||
import org.springframework.web.bind.annotation.PostMapping; | |||||
import org.springframework.web.bind.annotation.RequestBody; | |||||
import org.springframework.web.bind.annotation.RequestMapping; | |||||
import org.springframework.web.bind.annotation.RestController; | |||||
import javax.validation.Valid; | |||||
/** | |||||
* <p> | |||||
* 前端控制器 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-15 | |||||
*/ | |||||
@RestController | |||||
@AllArgsConstructor | |||||
@Api(tags = "专家评审") | |||||
@RequestMapping("/api/v1/expertReview") | |||||
public class ExpertReviewController { | |||||
private final ExpertReviewManage expertReviewManage; | |||||
@PostMapping("/save") | |||||
@ApiOperation("填写评审意见") | |||||
@WebLog("填写评审意见") | |||||
public void expertReview(@RequestBody @Valid ExpertReviewDetailReq req) { | |||||
expertReviewManage.expertReview(req); | |||||
} | |||||
} |
@@ -1,10 +1,12 @@ | |||||
package com.ningdatech.pmapi.expert.controller; | package com.ningdatech.pmapi.expert.controller; | ||||
import com.ningdatech.log.annotation.WebLog; | |||||
import com.ningdatech.pmapi.expert.manage.ReviewTemplateSettingsManage; | import com.ningdatech.pmapi.expert.manage.ReviewTemplateSettingsManage; | ||||
import com.ningdatech.pmapi.expert.model.req.ReviewTemplateReq; | import com.ningdatech.pmapi.expert.model.req.ReviewTemplateReq; | ||||
import com.ningdatech.pmapi.expert.model.vo.ReviewTemplateVO; | import com.ningdatech.pmapi.expert.model.vo.ReviewTemplateVO; | ||||
import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
import io.swagger.annotations.ApiModelProperty; | |||||
import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
import lombok.AllArgsConstructor; | import lombok.AllArgsConstructor; | ||||
import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||
@@ -27,16 +29,23 @@ public class ReviewTemplateSettingsController { | |||||
private final ReviewTemplateSettingsManage reviewTemplateSettingsManage; | private final ReviewTemplateSettingsManage reviewTemplateSettingsManage; | ||||
@GetMapping("/template/{templateType}") | |||||
@GetMapping("/template/{templateType}/{regionCode}") | |||||
@ApiOperation("根据模版类型获取模版") | @ApiOperation("根据模版类型获取模版") | ||||
public ReviewTemplateVO getReviewTemplateByType(@PathVariable Integer templateType) { | |||||
return reviewTemplateSettingsManage.getReviewTemplateSettings(templateType); | |||||
public ReviewTemplateVO getReviewTemplateByType(@PathVariable Integer templateType, @PathVariable String regionCode) { | |||||
return reviewTemplateSettingsManage.getReviewTemplateSettings(templateType, regionCode); | |||||
} | } | ||||
@PostMapping("/modify") | @PostMapping("/modify") | ||||
@ApiOperation("修改或保存模版配置") | @ApiOperation("修改或保存模版配置") | ||||
@WebLog("修改或保存模版配置") | |||||
public void modifyReviewTemplateSettings(@RequestBody @Valid ReviewTemplateReq req) { | public void modifyReviewTemplateSettings(@RequestBody @Valid ReviewTemplateReq req) { | ||||
reviewTemplateSettingsManage.saveOrUpdate(req); | reviewTemplateSettingsManage.saveOrUpdate(req); | ||||
} | } | ||||
@GetMapping("/template/{templateId}") | |||||
@ApiModelProperty("根据模版ID获取评审模版") | |||||
public ReviewTemplateVO getTemplateById(@PathVariable Long templateId) { | |||||
return reviewTemplateSettingsManage.getReviewTemplateSettings(templateId); | |||||
} | |||||
} | } |
@@ -0,0 +1,73 @@ | |||||
package com.ningdatech.pmapi.expert.manage; | |||||
import cn.hutool.json.JSONUtil; | |||||
import com.ningdatech.basic.exception.BizException; | |||||
import com.ningdatech.cache.lock.DistributedLock; | |||||
import com.ningdatech.pmapi.expert.model.entity.ExpertReview; | |||||
import com.ningdatech.pmapi.expert.model.req.ExpertReviewDetailReq; | |||||
import com.ningdatech.pmapi.expert.service.IExpertReviewService; | |||||
import com.ningdatech.pmapi.user.util.LoginUserUtil; | |||||
import lombok.RequiredArgsConstructor; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* ExpertReviewManage | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 14:25 2023/2/15 | |||||
*/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class ExpertReviewManage { | |||||
private final IExpertReviewService expertReviewService; | |||||
private final DistributedLock distributedLock; | |||||
private static final String EXPERT_REVIEW_KEY = "expert_review:"; | |||||
private String buildExpertReviewKey(Long projectId, Long expertId) { | |||||
return EXPERT_REVIEW_KEY + projectId + ":" + expertId; | |||||
} | |||||
public void expertReview(ExpertReviewDetailReq req) { | |||||
Long userId = LoginUserUtil.getUserId(); | |||||
Long projectId = req.getProjectId(); | |||||
String expertReviewKey = buildExpertReviewKey(projectId, userId); | |||||
if (!distributedLock.lock(expertReviewKey)) { | |||||
throw BizException.wrap("保存评审意见失败,请重试"); | |||||
} | |||||
try { | |||||
List<ExpertReview> reviews = expertReviewService.listByProjectIdAndExpertId(projectId, userId); | |||||
if (req.getIsFinal()) { | |||||
// TODO 判断所有专家是否都已评价 | |||||
if (reviews.isEmpty()) { | |||||
throw BizException.wrap("请先填写个人评审意见"); | |||||
} | |||||
if (reviews.size() > 1) { | |||||
throw BizException.wrap("不可重复填写最终评审意见"); | |||||
} | |||||
} else { | |||||
if (!reviews.isEmpty()) { | |||||
throw BizException.wrap("不可重复填写评审意见"); | |||||
} | |||||
} | |||||
ExpertReview review = new ExpertReview(); | |||||
review.setReviewResult(req.getReviewResult()); | |||||
review.setContent(JSONUtil.toJsonStr(req.getReviewTemplateOptions())); | |||||
review.setProjectId(req.getProjectId()); | |||||
review.setTemplateId(req.getTemplateId()); | |||||
review.setAdvice(req.getOtherAdvice()); | |||||
review.setAttachFileId(req.getAttachFileId()); | |||||
review.setIsFinal(req.getIsFinal()); | |||||
review.setCreator(LoginUserUtil.getUsername()); | |||||
expertReviewService.save(review); | |||||
} finally { | |||||
distributedLock.releaseLock(expertReviewKey); | |||||
} | |||||
} | |||||
} |
@@ -8,6 +8,7 @@ import com.ningdatech.basic.exception.BizException; | |||||
import com.ningdatech.pmapi.common.constant.BizConst; | import com.ningdatech.pmapi.common.constant.BizConst; | ||||
import com.ningdatech.pmapi.expert.model.dto.ReviewTemplateSettingsDTO; | import com.ningdatech.pmapi.expert.model.dto.ReviewTemplateSettingsDTO; | ||||
import com.ningdatech.pmapi.expert.model.entity.ReviewTemplateSettings; | import com.ningdatech.pmapi.expert.model.entity.ReviewTemplateSettings; | ||||
import com.ningdatech.pmapi.expert.model.enumeration.ReviewTemplateTypeEnum; | |||||
import com.ningdatech.pmapi.expert.model.req.ReviewTemplateReq; | import com.ningdatech.pmapi.expert.model.req.ReviewTemplateReq; | ||||
import com.ningdatech.pmapi.expert.model.vo.ReviewTemplateVO; | import com.ningdatech.pmapi.expert.model.vo.ReviewTemplateVO; | ||||
import com.ningdatech.pmapi.expert.service.IReviewTemplateSettingsService; | import com.ningdatech.pmapi.expert.service.IReviewTemplateSettingsService; | ||||
@@ -31,25 +32,37 @@ public class ReviewTemplateSettingsManage { | |||||
@Transactional(rollbackFor = Exception.class) | @Transactional(rollbackFor = Exception.class) | ||||
public void saveOrUpdate(ReviewTemplateReq req) { | public void saveOrUpdate(ReviewTemplateReq req) { | ||||
ReviewTemplateTypeEnum type = ReviewTemplateTypeEnum.getByCode(req.getTemplateType()); | |||||
LambdaUpdateWrapper<ReviewTemplateSettings> update = Wrappers.lambdaUpdate(ReviewTemplateSettings.class) | LambdaUpdateWrapper<ReviewTemplateSettings> update = Wrappers.lambdaUpdate(ReviewTemplateSettings.class) | ||||
.eq(ReviewTemplateSettings::getTemplateType, req.getTemplateType()) | |||||
.eq(ReviewTemplateSettings::getTemplateType, type.getCode()) | |||||
.eq(ReviewTemplateSettings::getRegionCode, req.getRegionCode()) | |||||
.eq(ReviewTemplateSettings::getIsLast, Boolean.TRUE) | .eq(ReviewTemplateSettings::getIsLast, Boolean.TRUE) | ||||
.set(ReviewTemplateSettings::getIsLast, Boolean.FALSE) | |||||
.last(BizConst.LIMIT_1); | |||||
.set(ReviewTemplateSettings::getIsLast, Boolean.FALSE); | |||||
reviewTemplateSettingsService.update(update); | reviewTemplateSettingsService.update(update); | ||||
ReviewTemplateSettings settings = new ReviewTemplateSettings(); | ReviewTemplateSettings settings = new ReviewTemplateSettings(); | ||||
settings.setTemplateType(req.getTemplateType()); | |||||
settings.setTemplateType(type.getCode()); | |||||
settings.setRegionCode(req.getRegionCode()); | |||||
settings.setIsLast(Boolean.TRUE); | settings.setIsLast(Boolean.TRUE); | ||||
settings.setContent(JSONUtil.toJsonStr(req.getTemplates())); | settings.setContent(JSONUtil.toJsonStr(req.getTemplates())); | ||||
reviewTemplateSettingsService.save(settings); | reviewTemplateSettingsService.save(settings); | ||||
} | } | ||||
public ReviewTemplateVO getReviewTemplateSettings(Integer templateType) { | |||||
public ReviewTemplateVO getReviewTemplateSettings(Integer templateType, String regionCode) { | |||||
LambdaQueryWrapper<ReviewTemplateSettings> query = Wrappers.lambdaQuery(ReviewTemplateSettings.class) | LambdaQueryWrapper<ReviewTemplateSettings> query = Wrappers.lambdaQuery(ReviewTemplateSettings.class) | ||||
.eq(ReviewTemplateSettings::getIsLast, Boolean.TRUE) | .eq(ReviewTemplateSettings::getIsLast, Boolean.TRUE) | ||||
.eq(ReviewTemplateSettings::getRegionCode, regionCode) | |||||
.eq(ReviewTemplateSettings::getTemplateType, templateType) | .eq(ReviewTemplateSettings::getTemplateType, templateType) | ||||
.last(BizConst.LIMIT_1); | .last(BizConst.LIMIT_1); | ||||
ReviewTemplateSettings settings = reviewTemplateSettingsService.getOne(query); | ReviewTemplateSettings settings = reviewTemplateSettingsService.getOne(query); | ||||
return buildTemplateDetail(settings); | |||||
} | |||||
public ReviewTemplateVO getReviewTemplateSettings(Long templateId) { | |||||
ReviewTemplateSettings settings = reviewTemplateSettingsService.getById(templateId); | |||||
return buildTemplateDetail(settings); | |||||
} | |||||
private ReviewTemplateVO buildTemplateDetail(ReviewTemplateSettings settings) { | |||||
if (settings == null) { | if (settings == null) { | ||||
throw BizException.wrap("模版不存在"); | throw BizException.wrap("模版不存在"); | ||||
} | } | ||||
@@ -0,0 +1,16 @@ | |||||
package com.ningdatech.pmapi.expert.mapper; | |||||
import com.ningdatech.pmapi.expert.model.entity.ExpertReview; | |||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||||
/** | |||||
* <p> | |||||
* Mapper 接口 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-15 | |||||
*/ | |||||
public interface ExpertReviewMapper extends BaseMapper<ExpertReview> { | |||||
} |
@@ -0,0 +1,5 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||||
<mapper namespace="com.ningdatech.pmapi.expert.mapper.ExpertReviewMapper"> | |||||
</mapper> |
@@ -0,0 +1,70 @@ | |||||
package com.ningdatech.pmapi.expert.model.entity; | |||||
import com.baomidou.mybatisplus.annotation.*; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.io.Serializable; | |||||
import java.time.LocalDateTime; | |||||
/** | |||||
* <p> | |||||
* 专家评价 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-15 | |||||
*/ | |||||
@Data | |||||
@TableName("nd_expert_review") | |||||
@ApiModel(value = "ExpertReview对象", description = "专家评价") | |||||
public class ExpertReview implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty("主键") | |||||
@TableId(type = IdType.AUTO) | |||||
private Long id; | |||||
@ApiModelProperty("项目ID") | |||||
private Long projectId; | |||||
@ApiModelProperty("评审模版配置ID") | |||||
private Long templateId; | |||||
@ApiModelProperty("评审内容") | |||||
private String content; | |||||
@ApiModelProperty("意见或建议") | |||||
private String advice; | |||||
@ApiModelProperty("附件ID") | |||||
private Long attachFileId; | |||||
@ApiModelProperty("评审结果") | |||||
private Integer reviewResult; | |||||
@ApiModelProperty("创建人姓名") | |||||
private String creator; | |||||
@ApiModelProperty("创建人") | |||||
@TableField(fill = FieldFill.INSERT) | |||||
private Long createBy; | |||||
@ApiModelProperty("创建时间") | |||||
@TableField(fill = FieldFill.INSERT) | |||||
private LocalDateTime createOn; | |||||
@ApiModelProperty("修改人") | |||||
@TableField(fill = FieldFill.INSERT_UPDATE) | |||||
private Long updateBy; | |||||
@ApiModelProperty("是否是最终意见") | |||||
private Boolean isFinal; | |||||
@ApiModelProperty("修改时间") | |||||
@TableField(fill = FieldFill.INSERT_UPDATE) | |||||
private LocalDateTime updateOn; | |||||
} |
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId; | |||||
import com.baomidou.mybatisplus.annotation.TableName; | import com.baomidou.mybatisplus.annotation.TableName; | ||||
import io.swagger.annotations.ApiModel; | import io.swagger.annotations.ApiModel; | ||||
import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
import lombok.Data; | |||||
import java.io.Serializable; | import java.io.Serializable; | ||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
@@ -17,6 +18,7 @@ import java.time.LocalDateTime; | |||||
* @author WendyYang | * @author WendyYang | ||||
* @since 2023-02-14 | * @since 2023-02-14 | ||||
*/ | */ | ||||
@Data | |||||
@TableName("nd_review_template_settings") | @TableName("nd_review_template_settings") | ||||
@ApiModel(value = "NdReviewTemplateSettings对象", description = "评审模版配置表") | @ApiModel(value = "NdReviewTemplateSettings对象", description = "评审模版配置表") | ||||
public class ReviewTemplateSettings implements Serializable { | public class ReviewTemplateSettings implements Serializable { | ||||
@@ -33,92 +35,18 @@ public class ReviewTemplateSettings implements Serializable { | |||||
@ApiModelProperty("模版内容") | @ApiModelProperty("模版内容") | ||||
private String content; | private String content; | ||||
private Long createBy; | |||||
private Long updateBy; | |||||
private LocalDateTime createOn; | |||||
private LocalDateTime updateOn; | |||||
@ApiModelProperty("是否是最新") | @ApiModelProperty("是否是最新") | ||||
private Boolean isLast; | private Boolean isLast; | ||||
public Long getId() { | |||||
return id; | |||||
} | |||||
public void setId(Long id) { | |||||
this.id = id; | |||||
} | |||||
public Integer getTemplateType() { | |||||
return templateType; | |||||
} | |||||
public void setTemplateType(Integer templateType) { | |||||
this.templateType = templateType; | |||||
} | |||||
public String getContent() { | |||||
return content; | |||||
} | |||||
@ApiModelProperty("区域编码") | |||||
private String regionCode; | |||||
public void setContent(String content) { | |||||
this.content = content; | |||||
} | |||||
public Long getCreateBy() { | |||||
return createBy; | |||||
} | |||||
public void setCreateBy(Long createBy) { | |||||
this.createBy = createBy; | |||||
} | |||||
public Long getUpdateBy() { | |||||
return updateBy; | |||||
} | |||||
public void setUpdateBy(Long updateBy) { | |||||
this.updateBy = updateBy; | |||||
} | |||||
public LocalDateTime getCreateOn() { | |||||
return createOn; | |||||
} | |||||
public void setCreateOn(LocalDateTime createOn) { | |||||
this.createOn = createOn; | |||||
} | |||||
public LocalDateTime getUpdateOn() { | |||||
return updateOn; | |||||
} | |||||
private Long createBy; | |||||
public void setUpdateOn(LocalDateTime updateOn) { | |||||
this.updateOn = updateOn; | |||||
} | |||||
private Long updateBy; | |||||
public Boolean getIsLast() { | |||||
return isLast; | |||||
} | |||||
private LocalDateTime createOn; | |||||
public void setIsLast(Boolean isLast) { | |||||
this.isLast = isLast; | |||||
} | |||||
private LocalDateTime updateOn; | |||||
@Override | |||||
public String toString() { | |||||
return "NdReviewTemplateSettings{" + | |||||
"id=" + id + | |||||
", templateType=" + templateType + | |||||
", content=" + content + | |||||
", createBy=" + createBy + | |||||
", updateBy=" + updateBy + | |||||
", createOn=" + createOn + | |||||
", updateOn=" + updateOn + | |||||
", isLast=" + isLast + | |||||
"}"; | |||||
} | |||||
} | } |
@@ -0,0 +1,67 @@ | |||||
package com.ningdatech.pmapi.expert.model.req; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import javax.validation.Valid; | |||||
import javax.validation.constraints.NotEmpty; | |||||
import javax.validation.constraints.NotNull; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* ExpertReviewDetailVO | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 14:37 2023/2/15 | |||||
*/ | |||||
@Data | |||||
public class ExpertReviewDetailReq { | |||||
@ApiModelProperty("模版ID") | |||||
@NotNull(message = "模版ID不能为空") | |||||
private Long templateId; | |||||
@ApiModelProperty("项目ID") | |||||
@NotNull(message = "项目ID不能为空") | |||||
private Long projectId; | |||||
@Valid | |||||
@ApiModelProperty("配置模版") | |||||
@NotEmpty(message = "配置不能为空") | |||||
private List<ReviewTemplateOptionVO> reviewTemplateOptions; | |||||
@ApiModelProperty("其他意见或建议") | |||||
@NotEmpty(message = "其他意见或建议不能为空") | |||||
private String otherAdvice; | |||||
@ApiModelProperty("附件ID") | |||||
private Long attachFileId; | |||||
@ApiModelProperty("评审结果:1 通过、2 需复核、3 不通过") | |||||
@NotNull(message = "评审结果不能为空") | |||||
private Integer reviewResult; | |||||
@ApiModelProperty("是否是最终意见") | |||||
@NotNull(message = "是否是最终意见不能为空") | |||||
private Boolean isFinal; | |||||
@Data | |||||
public static class ReviewTemplateOptionVO { | |||||
@ApiModelProperty("问题序号") | |||||
@NotNull(message = "问题序号不能为空") | |||||
private Integer questionSerialNo; | |||||
@ApiModelProperty("选项序号") | |||||
@NotEmpty(message = "选项序号不能为空") | |||||
private List<Integer> optionSerialNo; | |||||
@ApiModelProperty("其他意见或建议") | |||||
private String otherAdvice; | |||||
} | |||||
} |
@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | import lombok.Data; | ||||
import javax.validation.Valid; | import javax.validation.Valid; | ||||
import javax.validation.constraints.NotBlank; | |||||
import javax.validation.constraints.NotEmpty; | import javax.validation.constraints.NotEmpty; | ||||
import javax.validation.constraints.NotNull; | import javax.validation.constraints.NotNull; | ||||
import java.util.List; | import java.util.List; | ||||
@@ -24,6 +25,10 @@ public class ReviewTemplateReq { | |||||
@NotNull(message = "模版类型不能为空") | @NotNull(message = "模版类型不能为空") | ||||
private Integer templateType; | private Integer templateType; | ||||
@ApiModelProperty("区域编码") | |||||
@NotBlank(message = "区域编码不能为空") | |||||
private String regionCode; | |||||
@Valid | @Valid | ||||
@NotEmpty(message = "模版不能为空") | @NotEmpty(message = "模版不能为空") | ||||
@ApiModelProperty("模版数据") | @ApiModelProperty("模版数据") | ||||
@@ -0,0 +1,28 @@ | |||||
package com.ningdatech.pmapi.expert.service; | |||||
import com.ningdatech.pmapi.expert.model.entity.ExpertReview; | |||||
import com.baomidou.mybatisplus.extension.service.IService; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 服务类 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-15 | |||||
*/ | |||||
public interface IExpertReviewService extends IService<ExpertReview> { | |||||
/** | |||||
* 根据项目ID和专家ID获取评审记录 | |||||
* | |||||
* @param projectId 项目ID | |||||
* @param expertId 专家ID | |||||
* @return 评审记录 | |||||
* @author WendyYang | |||||
**/ | |||||
List<ExpertReview> listByProjectIdAndExpertId(Long projectId, Long expertId); | |||||
} |
@@ -0,0 +1,33 @@ | |||||
package com.ningdatech.pmapi.expert.service.impl; | |||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |||||
import com.ningdatech.pmapi.expert.mapper.ExpertReviewMapper; | |||||
import com.ningdatech.pmapi.expert.model.entity.ExpertReview; | |||||
import com.ningdatech.pmapi.expert.service.IExpertReviewService; | |||||
import org.springframework.stereotype.Service; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* 服务实现类 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-15 | |||||
*/ | |||||
@Service | |||||
public class ExpertReviewServiceImpl extends ServiceImpl<ExpertReviewMapper, ExpertReview> implements IExpertReviewService { | |||||
@Override | |||||
public List<ExpertReview> listByProjectIdAndExpertId(Long projectId, Long expertId) { | |||||
LambdaQueryWrapper<ExpertReview> query = Wrappers.lambdaQuery(ExpertReview.class); | |||||
query.eq(ExpertReview::getProjectId, projectId); | |||||
query.eq(ExpertReview::getCreateBy, expertId); | |||||
query.orderByAsc(ExpertReview::getCreateOn); | |||||
return list(query); | |||||
} | |||||
} |
@@ -0,0 +1,20 @@ | |||||
package com.ningdatech.pmapi.projectlib.controller; | |||||
import org.springframework.web.bind.annotation.RequestMapping; | |||||
import org.springframework.stereotype.Controller; | |||||
/** | |||||
* <p> | |||||
* 续建项目资金申请表 前端控制器 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-15 | |||||
*/ | |||||
@Controller | |||||
@RequestMapping("/pmapi.projectlib/nd-project-renewal-fund-declaration") | |||||
public class ProjectRenewalFundDeclarationController { | |||||
} |
@@ -0,0 +1,16 @@ | |||||
package com.ningdatech.pmapi.projectlib.mapper; | |||||
import com.ningdatech.pmapi.projectlib.model.entity.ProjectRenewalFundDeclaration; | |||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||||
/** | |||||
* <p> | |||||
* 续建项目资金申请表 Mapper 接口 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-15 | |||||
*/ | |||||
public interface ProjectRenewalFundDeclarationMapper extends BaseMapper<ProjectRenewalFundDeclaration> { | |||||
} |
@@ -0,0 +1,5 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||||
<mapper namespace="com.ningdatech.pmapi.projectlib.mapper.ProjectRenewalFundDeclarationMapper"> | |||||
</mapper> |
@@ -0,0 +1,173 @@ | |||||
package com.ningdatech.pmapi.projectlib.model.entity; | |||||
import com.baomidou.mybatisplus.annotation.TableName; | |||||
import java.io.Serializable; | |||||
import java.math.BigDecimal; | |||||
import java.time.LocalDateTime; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
/** | |||||
* <p> | |||||
* 续建项目资金申请表 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-15 | |||||
*/ | |||||
@TableName("nd_project_renewal_fund_declaration") | |||||
@ApiModel(value = "NdProjectRenewalFundDeclaration对象", description = "续建项目资金申请表") | |||||
public class ProjectRenewalFundDeclaration implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
@ApiModelProperty("主键") | |||||
private Long id; | |||||
@ApiModelProperty("创建时间") | |||||
private LocalDateTime createOn; | |||||
@ApiModelProperty("修改时间") | |||||
private LocalDateTime updateOn; | |||||
@ApiModelProperty("关联项目ID") | |||||
private Long projectId; | |||||
@ApiModelProperty("项目年份") | |||||
private Integer projectYear; | |||||
@ApiModelProperty("年度支付金额") | |||||
private BigDecimal annualPaymentAmount; | |||||
@ApiModelProperty("自有资金") | |||||
private BigDecimal haveAmount; | |||||
@ApiModelProperty("政府投资 本级财务金额") | |||||
private BigDecimal govOwnFinanceAmount; | |||||
@ApiModelProperty("政府投资 上级财务金额") | |||||
private BigDecimal govSuperiorFinanceAmount; | |||||
@ApiModelProperty("银行贷款金额") | |||||
private BigDecimal bankLendingAmount; | |||||
@ApiModelProperty("其它金额") | |||||
private BigDecimal otherAmount; | |||||
@ApiModelProperty("审核状态 待审核PENGING 审核通过PASS 审核不通过NO_PASS") | |||||
private String approvalStatus; | |||||
@ApiModelProperty("是否删除 false未删 true已删") | |||||
private Boolean deleted; | |||||
public Long getId() { | |||||
return id; | |||||
} | |||||
public void setId(Long id) { | |||||
this.id = id; | |||||
} | |||||
public LocalDateTime getCreateOn() { | |||||
return createOn; | |||||
} | |||||
public void setCreateOn(LocalDateTime createOn) { | |||||
this.createOn = createOn; | |||||
} | |||||
public LocalDateTime getUpdateOn() { | |||||
return updateOn; | |||||
} | |||||
public void setUpdateOn(LocalDateTime updateOn) { | |||||
this.updateOn = updateOn; | |||||
} | |||||
public Long getProjectId() { | |||||
return projectId; | |||||
} | |||||
public void setProjectId(Long projectId) { | |||||
this.projectId = projectId; | |||||
} | |||||
public Integer getProjectYear() { | |||||
return projectYear; | |||||
} | |||||
public void setProjectYear(Integer projectYear) { | |||||
this.projectYear = projectYear; | |||||
} | |||||
public BigDecimal getAnnualPaymentAmount() { | |||||
return annualPaymentAmount; | |||||
} | |||||
public void setAnnualPaymentAmount(BigDecimal annualPaymentAmount) { | |||||
this.annualPaymentAmount = annualPaymentAmount; | |||||
} | |||||
public BigDecimal getHaveAmount() { | |||||
return haveAmount; | |||||
} | |||||
public void setHaveAmount(BigDecimal haveAmount) { | |||||
this.haveAmount = haveAmount; | |||||
} | |||||
public BigDecimal getGovOwnFinanceAmount() { | |||||
return govOwnFinanceAmount; | |||||
} | |||||
public void setGovOwnFinanceAmount(BigDecimal govOwnFinanceAmount) { | |||||
this.govOwnFinanceAmount = govOwnFinanceAmount; | |||||
} | |||||
public BigDecimal getGovSuperiorFinanceAmount() { | |||||
return govSuperiorFinanceAmount; | |||||
} | |||||
public void setGovSuperiorFinanceAmount(BigDecimal govSuperiorFinanceAmount) { | |||||
this.govSuperiorFinanceAmount = govSuperiorFinanceAmount; | |||||
} | |||||
public BigDecimal getBankLendingAmount() { | |||||
return bankLendingAmount; | |||||
} | |||||
public void setBankLendingAmount(BigDecimal bankLendingAmount) { | |||||
this.bankLendingAmount = bankLendingAmount; | |||||
} | |||||
public BigDecimal getOtherAmount() { | |||||
return otherAmount; | |||||
} | |||||
public void setOtherAmount(BigDecimal otherAmount) { | |||||
this.otherAmount = otherAmount; | |||||
} | |||||
public String getApprovalStatus() { | |||||
return approvalStatus; | |||||
} | |||||
public void setApprovalStatus(String approvalStatus) { | |||||
this.approvalStatus = approvalStatus; | |||||
} | |||||
public Boolean getDeleted() { | |||||
return deleted; | |||||
} | |||||
public void setDeleted(Boolean deleted) { | |||||
this.deleted = deleted; | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return "NdProjectRenewalFundDeclaration{" + | |||||
"id=" + id + | |||||
", createOn=" + createOn + | |||||
", updateOn=" + updateOn + | |||||
", projectId=" + projectId + | |||||
", projectYear=" + projectYear + | |||||
", annualPaymentAmount=" + annualPaymentAmount + | |||||
", haveAmount=" + haveAmount + | |||||
", govOwnFinanceAmount=" + govOwnFinanceAmount + | |||||
", govSuperiorFinanceAmount=" + govSuperiorFinanceAmount + | |||||
", bankLendingAmount=" + bankLendingAmount + | |||||
", otherAmount=" + otherAmount + | |||||
", approvalStatus=" + approvalStatus + | |||||
", deleted=" + deleted + | |||||
"}"; | |||||
} | |||||
} |
@@ -0,0 +1,16 @@ | |||||
package com.ningdatech.pmapi.projectlib.service; | |||||
import com.ningdatech.pmapi.projectlib.model.entity.ProjectRenewalFundDeclaration; | |||||
import com.baomidou.mybatisplus.extension.service.IService; | |||||
/** | |||||
* <p> | |||||
* 续建项目资金申请表 服务类 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-15 | |||||
*/ | |||||
public interface IProjectRenewalFundDeclarationService extends IService<ProjectRenewalFundDeclaration> { | |||||
} |
@@ -0,0 +1,20 @@ | |||||
package com.ningdatech.pmapi.projectlib.service.impl; | |||||
import com.ningdatech.pmapi.projectlib.model.entity.ProjectRenewalFundDeclaration; | |||||
import com.ningdatech.pmapi.projectlib.mapper.ProjectRenewalFundDeclarationMapper; | |||||
import com.ningdatech.pmapi.projectlib.service.IProjectRenewalFundDeclarationService; | |||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |||||
import org.springframework.stereotype.Service; | |||||
/** | |||||
* <p> | |||||
* 续建项目资金申请表 服务实现类 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-15 | |||||
*/ | |||||
@Service | |||||
public class ProjectRenewalFundDeclarationServiceImpl extends ServiceImpl<ProjectRenewalFundDeclarationMapper, ProjectRenewalFundDeclaration> implements IProjectRenewalFundDeclarationService { | |||||
} |
@@ -102,6 +102,12 @@ logging: | |||||
file: | file: | ||||
path: logs | path: logs | ||||
nd: | nd: | ||||
cache: | |||||
type: REDIS | |||||
serializerType: ProtoStuff | |||||
cacheNullVal: true | |||||
def: | |||||
keyPrefix: pm | |||||
log: | log: | ||||
enabled: true | enabled: true | ||||
type: DB | type: DB | ||||