Compare commits

...

2 Commits
master ... jgq

10 changed files with 617 additions and 2 deletions

6
.gitignore vendored
View File

@ -36,3 +36,9 @@ build/
.vscode/
target/
logs/
### Maven ###
pom.xml
### YAML ###
*.yaml

View File

@ -0,0 +1,91 @@
package com.dite.znpt.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.dite.znpt.domain.AuditableEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author Bear.G
* @date 2025/1/8/周三 17:26
* @description 设备审批实体
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("equipment_approval")
@ApiModel(value="EquipmentApprovalEntity对象", description="设备审批信息表")
public class EquipmentApprovalEntity extends AuditableEntity implements Serializable {
private static final long serialVersionUID = -6665040704562461286L;
@ApiModelProperty("审批ID")
@TableId(type = IdType.ASSIGN_ID)
private String approvalId;
@ApiModelProperty("设备ID")
private String equipmentId;
@ApiModelProperty("设备名称")
private String equipmentName;
@ApiModelProperty("设备类型")
private String equipmentType;
@ApiModelProperty("设备型号")
private String equipmentModel;
@ApiModelProperty("品牌")
private String brand;
@ApiModelProperty("供应商名称")
private String supplierName;
@ApiModelProperty("采购价格")
private BigDecimal purchasePrice;
@ApiModelProperty("总价")
private BigDecimal totalPrice;
@ApiModelProperty("数量")
private Integer quantity;
@ApiModelProperty("申请人")
private String applicantName;
@ApiModelProperty("申请人ID")
private String applicantId;
@ApiModelProperty("申请时间")
private LocalDateTime applyTime;
@ApiModelProperty("申请原因")
private String applyReason;
@ApiModelProperty("业务类型PROCUREMENT-采购BORROW-借用RETURN-归还")
private String businessType;
@ApiModelProperty("审批状态PENDING-待审批APPROVED-已通过REJECTED-已拒绝")
private String approvalStatus;
@ApiModelProperty("审批人")
private String approverName;
@ApiModelProperty("审批人ID")
private String approverId;
@ApiModelProperty("审批时间")
private LocalDateTime approvalTime;
@ApiModelProperty("审批意见")
private String approvalComment;
@ApiModelProperty("删除标志0代表存在 1代表删除")
@TableLogic
private String delFlag;
}

View File

@ -0,0 +1,14 @@
package com.dite.znpt.domain.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dite.znpt.domain.entity.EquipmentApprovalEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* @author Bear.G
* @date 2025/1/8/周三 17:30
* @description 设备审批Mapper接口
*/
@Mapper
public interface EquipmentApprovalMapper extends BaseMapper<EquipmentApprovalEntity> {
}

View File

@ -0,0 +1,54 @@
package com.dite.znpt.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author Bear.G
* @date 2025/1/8/周三 17:45
* @description 设备审批列表查询请求VO
*/
@Data
@ApiModel(value="EquipmentApprovalListReq对象", description="设备审批列表查询请求")
public class EquipmentApprovalListReq implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("设备名称")
private String equipmentName;
@ApiModelProperty("申请人")
private String applicantName;
@ApiModelProperty("业务类型PROCUREMENT-采购BORROW-借用RETURN-归还")
private String businessType;
@ApiModelProperty("审批状态")
private String approvalStatus;
@ApiModelProperty("申请时间开始")
private String applyTimeStart;
@ApiModelProperty("申请时间结束")
private String applyTimeEnd;
@ApiModelProperty("审批时间开始")
private String approvalTimeStart;
@ApiModelProperty("审批时间结束")
private String approvalTimeEnd;
@ApiModelProperty("当前页码")
private Integer page;
@ApiModelProperty("每页大小")
private Integer pageSize;
@ApiModelProperty("排序字段")
private String orderBy;
@ApiModelProperty("排序方向")
private String orderDirection;
}

View File

@ -0,0 +1,33 @@
package com.dite.znpt.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @author Bear.G
* @date 2025/1/8/周三 17:35
* @description 设备审批请求VO
*/
@Data
@ApiModel(value="EquipmentApprovalReq对象", description="设备审批请求")
public class EquipmentApprovalReq implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("审批意见")
private String approvalComment;
@ApiModelProperty("审批结果APPROVED-通过REJECTED-拒绝")
@NotBlank(message = "审批结果不能为空")
private String approvalResult;
@ApiModelProperty("审批人")
private String approverName;
@ApiModelProperty("审批人ID")
private String approverId;
}

View File

@ -0,0 +1,86 @@
package com.dite.znpt.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author Bear.G
* @date 2025/1/8/周三 17:40
* @description 设备审批响应VO
*/
@Data
@ApiModel(value="EquipmentApprovalResp对象", description="设备审批响应")
public class EquipmentApprovalResp implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("审批ID")
private String approvalId;
@ApiModelProperty("设备ID")
private String equipmentId;
@ApiModelProperty("设备名称")
private String equipmentName;
@ApiModelProperty("设备类型")
private String equipmentType;
@ApiModelProperty("设备型号")
private String equipmentModel;
@ApiModelProperty("品牌")
private String brand;
@ApiModelProperty("供应商名称")
private String supplierName;
@ApiModelProperty("采购价格")
private BigDecimal purchasePrice;
@ApiModelProperty("总价")
private BigDecimal totalPrice;
@ApiModelProperty("数量")
private Integer quantity;
@ApiModelProperty("申请人")
private String applicantName;
@ApiModelProperty("申请人ID")
private String applicantId;
@ApiModelProperty("申请时间")
private LocalDateTime applyTime;
@ApiModelProperty("申请原因")
private String applyReason;
@ApiModelProperty("业务类型PROCUREMENT-采购BORROW-借用RETURN-归还")
private String businessType;
@ApiModelProperty("审批状态")
private String approvalStatus;
@ApiModelProperty("审批人")
private String approverName;
@ApiModelProperty("审批人ID")
private String approverId;
@ApiModelProperty("审批时间")
private LocalDateTime approvalTime;
@ApiModelProperty("审批意见")
private String approvalComment;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("更新时间")
private LocalDateTime updateTime;
}

View File

@ -1,5 +1,6 @@
package com.dite.znpt.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -29,7 +30,7 @@ public class EquipmentResp implements Serializable {
@ApiModelProperty("设备名称")
private String equipmentName;
@ApiModelProperty("设备类型")
@ApiModelProperty("类型")
private String equipmentType;
@ApiModelProperty("设备类型描述")
@ -75,21 +76,27 @@ public class EquipmentResp implements Serializable {
private String healthStatusLabel;
@ApiModelProperty("采购时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime purchaseTime;
@ApiModelProperty("入库时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime inStockTime;
@ApiModelProperty("启用时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime activationTime;
@ApiModelProperty("预计报废时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime expectedScrapTime;
@ApiModelProperty("实际报废时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime actualScrapTime;
@ApiModelProperty("状态变更时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime statusChangeTime;
@ApiModelProperty("采购订单")
@ -115,12 +122,15 @@ public class EquipmentResp implements Serializable {
private BigDecimal salvageValue;
@ApiModelProperty("保修截止日期")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime warrantyExpireDate;
@ApiModelProperty("上次维护日期")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime lastMaintenanceDate;
@ApiModelProperty("下次维护日期")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime nextMaintenanceDate;
@ApiModelProperty("维护人员")
@ -168,12 +178,15 @@ public class EquipmentResp implements Serializable {
private String usingDepartment;
@ApiModelProperty("领用时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime borrowingTime;
@ApiModelProperty("归还时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime returnTime;
@ApiModelProperty("出库时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime outStockTime;
@ApiModelProperty("总使用时间")
@ -234,8 +247,10 @@ public class EquipmentResp implements Serializable {
private String name;
@ApiModelProperty("创建时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime createTime;
@ApiModelProperty("更新时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private LocalDateTime updateTime;
}

View File

@ -0,0 +1,44 @@
package com.dite.znpt.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.dite.znpt.domain.vo.EquipmentApprovalListReq;
import com.dite.znpt.domain.vo.EquipmentApprovalReq;
import com.dite.znpt.domain.vo.EquipmentApprovalResp;
/**
* @author Bear.G
* @date 2025/1/8/周三 17:50
* @description 设备审批服务接口
*/
public interface EquipmentApprovalService {
/**
* 分页查询待审批的设备采购申请
*/
IPage<EquipmentApprovalResp> getPendingApprovals(EquipmentApprovalListReq req);
/**
* 分页查询已审批的设备采购申请
*/
IPage<EquipmentApprovalResp> getApprovedApprovals(EquipmentApprovalListReq req);
/**
* 审批通过
*/
void approve(String approvalId, EquipmentApprovalReq req);
/**
* 审批拒绝
*/
void reject(String approvalId, EquipmentApprovalReq req);
/**
* 获取审批详情
*/
EquipmentApprovalResp getApprovalDetail(String approvalId);
/**
* 获取审批统计信息
*/
Object getApprovalStats();
}

View File

@ -0,0 +1,199 @@
package com.dite.znpt.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dite.znpt.domain.entity.EquipmentApprovalEntity;
import com.dite.znpt.domain.mapper.EquipmentApprovalMapper;
import com.dite.znpt.domain.vo.EquipmentApprovalListReq;
import com.dite.znpt.domain.vo.EquipmentApprovalReq;
import com.dite.znpt.domain.vo.EquipmentApprovalResp;
import com.dite.znpt.service.EquipmentApprovalService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author Bear.G
* @date 2025/1/8/周三 17:55
* @description 设备审批服务实现类
*/
@Service
public class EquipmentApprovalServiceImpl implements EquipmentApprovalService {
@Resource
private EquipmentApprovalMapper equipmentApprovalMapper;
@Override
public IPage<EquipmentApprovalResp> getPendingApprovals(EquipmentApprovalListReq req) {
// 创建分页对象处理null值
Integer pageNum = req.getPage() != null ? req.getPage() : 1;
Integer pageSize = req.getPageSize() != null ? req.getPageSize() : 10;
Page<EquipmentApprovalEntity> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<EquipmentApprovalEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(EquipmentApprovalEntity::getApprovalStatus, "PENDING");
// 添加查询条件
addQueryConditions(wrapper, req);
IPage<EquipmentApprovalEntity> result = equipmentApprovalMapper.selectPage(page, wrapper);
return convertToRespPage(result);
}
@Override
public IPage<EquipmentApprovalResp> getApprovedApprovals(EquipmentApprovalListReq req) {
// 创建分页对象处理null值
Integer pageNum = req.getPage() != null ? req.getPage() : 1;
Integer pageSize = req.getPageSize() != null ? req.getPageSize() : 10;
Page<EquipmentApprovalEntity> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<EquipmentApprovalEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.in(EquipmentApprovalEntity::getApprovalStatus, "APPROVED", "REJECTED");
// 添加查询条件
addQueryConditions(wrapper, req);
IPage<EquipmentApprovalEntity> result = equipmentApprovalMapper.selectPage(page, wrapper);
return convertToRespPage(result);
}
@Override
public void approve(String approvalId, EquipmentApprovalReq req) {
EquipmentApprovalEntity entity = equipmentApprovalMapper.selectById(approvalId);
if (entity == null) {
throw new RuntimeException("审批记录不存在");
}
entity.setApprovalStatus("APPROVED");
entity.setApproverName(req.getApproverName());
entity.setApproverId(req.getApproverId());
entity.setApprovalTime(LocalDateTime.now());
entity.setApprovalComment(req.getApprovalComment());
equipmentApprovalMapper.updateById(entity);
}
@Override
public void reject(String approvalId, EquipmentApprovalReq req) {
EquipmentApprovalEntity entity = equipmentApprovalMapper.selectById(approvalId);
if (entity == null) {
throw new RuntimeException("审批记录不存在");
}
entity.setApprovalStatus("REJECTED");
entity.setApproverName(req.getApproverName());
entity.setApproverId(req.getApproverId());
entity.setApprovalTime(LocalDateTime.now());
entity.setApprovalComment(req.getApprovalComment());
equipmentApprovalMapper.updateById(entity);
}
@Override
public EquipmentApprovalResp getApprovalDetail(String approvalId) {
EquipmentApprovalEntity entity = equipmentApprovalMapper.selectById(approvalId);
if (entity == null) {
return null;
}
return convertToResp(entity);
}
@Override
public Object getApprovalStats() {
Map<String, Object> stats = new HashMap<>();
// 待审批数量
LambdaQueryWrapper<EquipmentApprovalEntity> pendingWrapper = new LambdaQueryWrapper<>();
pendingWrapper.eq(EquipmentApprovalEntity::getApprovalStatus, "PENDING");
long pendingCount = equipmentApprovalMapper.selectCount(pendingWrapper);
stats.put("pendingCount", pendingCount);
// 已通过数量
LambdaQueryWrapper<EquipmentApprovalEntity> approvedWrapper = new LambdaQueryWrapper<>();
approvedWrapper.eq(EquipmentApprovalEntity::getApprovalStatus, "APPROVED");
long approvedCount = equipmentApprovalMapper.selectCount(approvedWrapper);
stats.put("approvedCount", approvedCount);
// 已拒绝数量
LambdaQueryWrapper<EquipmentApprovalEntity> rejectedWrapper = new LambdaQueryWrapper<>();
rejectedWrapper.eq(EquipmentApprovalEntity::getApprovalStatus, "REJECTED");
long rejectedCount = equipmentApprovalMapper.selectCount(rejectedWrapper);
stats.put("rejectedCount", rejectedCount);
return stats;
}
/**
* 添加查询条件
*/
private void addQueryConditions(LambdaQueryWrapper<EquipmentApprovalEntity> wrapper, EquipmentApprovalListReq req) {
if (StringUtils.hasText(req.getEquipmentName())) {
wrapper.like(EquipmentApprovalEntity::getEquipmentName, req.getEquipmentName());
}
if (StringUtils.hasText(req.getApplicantName())) {
wrapper.like(EquipmentApprovalEntity::getApplicantName, req.getApplicantName());
}
if (StringUtils.hasText(req.getBusinessType())) {
wrapper.eq(EquipmentApprovalEntity::getBusinessType, req.getBusinessType());
}
if (StringUtils.hasText(req.getApprovalStatus())) {
wrapper.eq(EquipmentApprovalEntity::getApprovalStatus, req.getApprovalStatus());
}
if (StringUtils.hasText(req.getApplyTimeStart())) {
wrapper.ge(EquipmentApprovalEntity::getApplyTime, req.getApplyTimeStart());
}
if (StringUtils.hasText(req.getApplyTimeEnd())) {
wrapper.le(EquipmentApprovalEntity::getApplyTime, req.getApplyTimeEnd());
}
if (StringUtils.hasText(req.getApprovalTimeStart())) {
wrapper.ge(EquipmentApprovalEntity::getApprovalTime, req.getApprovalTimeStart());
}
if (StringUtils.hasText(req.getApprovalTimeEnd())) {
wrapper.le(EquipmentApprovalEntity::getApprovalTime, req.getApprovalTimeEnd());
}
// 排序
wrapper.orderByDesc(EquipmentApprovalEntity::getCreateTime);
}
/**
* 转换为响应对象
*/
private EquipmentApprovalResp convertToResp(EquipmentApprovalEntity entity) {
EquipmentApprovalResp resp = new EquipmentApprovalResp();
BeanUtils.copyProperties(entity, resp);
return resp;
}
/**
* 转换为响应分页对象
*/
private IPage<EquipmentApprovalResp> convertToRespPage(IPage<EquipmentApprovalEntity> page) {
List<EquipmentApprovalResp> records = page.getRecords().stream()
.map(this::convertToResp)
.collect(Collectors.toList());
Page<EquipmentApprovalResp> respPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
respPage.setRecords(records);
return respPage;
}
}

View File

@ -0,0 +1,73 @@
package com.dite.znpt.web.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.dite.znpt.domain.PageResult;
import com.dite.znpt.domain.Result;
import com.dite.znpt.domain.vo.EquipmentApprovalListReq;
import com.dite.znpt.domain.vo.EquipmentApprovalReq;
import com.dite.znpt.domain.vo.EquipmentApprovalResp;
import com.dite.znpt.service.EquipmentApprovalService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Bear.G
* @date 2025/1/8/周三 18:00
* @description 设备审批控制器
*/
@Api(tags = "设备审批管理")
@RestController
@RequestMapping("/equipment/approval")
public class EquipmentApprovalController {
private static final Logger log = LoggerFactory.getLogger(EquipmentApprovalController.class);
@Resource
private EquipmentApprovalService equipmentApprovalService;
@ApiOperation(value = "分页查询待审批的设备采购申请", httpMethod = "GET")
@GetMapping("/pending")
public PageResult<EquipmentApprovalResp> getPendingApprovals(EquipmentApprovalListReq req) {
IPage<EquipmentApprovalResp> page = equipmentApprovalService.getPendingApprovals(req);
return PageResult.ok(page.getRecords(), page.getTotal());
}
@ApiOperation(value = "分页查询已审批的设备采购申请", httpMethod = "GET")
@GetMapping("/approved")
public PageResult<EquipmentApprovalResp> getApprovedApprovals(EquipmentApprovalListReq req) {
IPage<EquipmentApprovalResp> page = equipmentApprovalService.getApprovedApprovals(req);
return PageResult.ok(page.getRecords(), page.getTotal());
}
@ApiOperation(value = "审批通过", httpMethod = "POST")
@PostMapping("/{approvalId}/approve")
public Result<?> approve(@PathVariable String approvalId, @Validated @RequestBody EquipmentApprovalReq req) {
equipmentApprovalService.approve(approvalId, req);
return Result.ok();
}
@ApiOperation(value = "审批拒绝", httpMethod = "POST")
@PostMapping("/{approvalId}/reject")
public Result<?> reject(@PathVariable String approvalId, @Validated @RequestBody EquipmentApprovalReq req) {
equipmentApprovalService.reject(approvalId, req);
return Result.ok();
}
@ApiOperation(value = "获取审批详情", httpMethod = "GET")
@GetMapping("/{approvalId}")
public Result<EquipmentApprovalResp> getApprovalDetail(@PathVariable String approvalId) {
return Result.ok(equipmentApprovalService.getApprovalDetail(approvalId));
}
@ApiOperation(value = "获取审批统计信息", httpMethod = "GET")
@GetMapping("/stats")
public Result<?> getApprovalStats() {
return Result.ok(equipmentApprovalService.getApprovalStats());
}
}