diff --git a/core/pom.xml b/core/pom.xml
index 94afd03..a1e8bba 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -10,6 +10,10 @@
core
1.0.0-SNAPSHOT
+
+ UTF-8
+
+
org.springframework.boot
@@ -161,6 +165,38 @@
opencv
4.7.0-0
+
+
+
+ org.springframework.boot
+ spring-boot-starter-mail
+
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+
+
+ com.aliyun
+ aliyun-java-sdk-core
+ 4.6.3
+
+
+
+
+ com.aliyun
+ aliyun-java-sdk-dysmsapi
+ 2.1.0
+
+
+
+
+ javax.xml.bind
+ jaxb-api
+ 2.3.1
+
diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java
index 272e17e..ea0dd55 100644
--- a/core/src/main/java/com/dite/znpt/converts/Converts.java
+++ b/core/src/main/java/com/dite/znpt/converts/Converts.java
@@ -59,6 +59,8 @@ public interface Converts {
List toRoleResp(List list);
+ List toUserResp(List list);
+
RoleEntity toRoleEntity(RoleReq req);
MenuEntity toMenuEntity(MenuReq req);
diff --git a/core/src/main/java/com/dite/znpt/domain/dto/FolderDto.java b/core/src/main/java/com/dite/znpt/domain/dto/FolderDto.java
new file mode 100644
index 0000000..a91faff
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/dto/FolderDto.java
@@ -0,0 +1,15 @@
+package com.dite.znpt.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("接受文件夹参数")
+public class FolderDto {
+ private String name = "tom";
+ private Long parentId = 0L;
+}
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataEntity.java
new file mode 100644
index 0000000..3bd598e
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataEntity.java
@@ -0,0 +1,38 @@
+package com.dite.znpt.domain.entity;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("business_data_part")
+@ApiModel(value="商务资料文件夹对象")
+@AllArgsConstructor
+@NoArgsConstructor
+public class BusinessDataEntity {
+
+ // 主键
+ private Long folderId = null;
+ // 文件夹名称
+ private String folderName = null;
+ // 父级文件夹
+ private Long parentId = null;
+ // 创建人
+ private Long creatorId = null;
+ // 创建时间
+ private LocalDateTime createTime = null;
+ // 更新时间
+ private LocalDateTime updateTime = null;
+ // 是否删除
+ private Boolean isDeleted = false;
+ // 文件夹路径
+ private String folderPath = null;
+
+}
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java
new file mode 100644
index 0000000..6b14ed8
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java
@@ -0,0 +1,37 @@
+package com.dite.znpt.domain.entity;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("business_data_part_file")
+@ApiModel(value="商务资料对象")
+
+public class BusinessDataFileEntity {
+
+ //文件id
+ private Long fileId = null;
+ //文件夹id
+ private Long folderId = null;
+ //文件名
+ private String fileName = null;
+ //文件路径
+ private String filePath = null;
+ //文件类型
+ private String fileType = "unknown";
+ //文件大小
+ private Long fileSize = null;
+ //上传时间
+ private Date uploadTime = null;
+ //上传人id
+ private Long uploaderId = null;
+ //是否删除
+ private Boolean isDeleted = false;
+
+}
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java
index 098ae58..4224af2 100644
--- a/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java
+++ b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java
@@ -7,8 +7,9 @@ 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
@@ -20,13 +21,15 @@ import java.io.Serializable;
@TableName("equipment")
@ApiModel(value="EquipmentEntity对象", description="设备信息表")
public class EquipmentEntity extends AuditableEntity implements Serializable {
- @Serial
private static final long serialVersionUID = -6665040704562461286L;
@ApiModelProperty("设备id")
@TableId(type = IdType.ASSIGN_ID)
private String equipmentId;
+ @ApiModelProperty("资产编号")
+ private String assetCode;
+
@ApiModelProperty("设备名称")
private String equipmentName;
@@ -45,6 +48,165 @@ public class EquipmentEntity extends AuditableEntity implements Serializable {
@ApiModelProperty("设备序列号")
private String equipmentSn;
+ @ApiModelProperty("品牌")
+ private String brand;
+
+ @ApiModelProperty("配置规格/参数")
+ private String specification;
+
+ @ApiModelProperty("位置状态")
+ private String locationStatus;
+
+ @ApiModelProperty("设备当前物理位置")
+ private String physicalLocation;
+
+ @ApiModelProperty("负责人")
+ private String responsiblePerson;
+
+ @ApiModelProperty("健康状态")
+ private String healthStatus;
+
+ @ApiModelProperty("采购时间")
+ private LocalDateTime purchaseTime;
+
+ @ApiModelProperty("入库时间")
+ private LocalDateTime inStockTime;
+
+ @ApiModelProperty("启用时间")
+ private LocalDateTime activationTime;
+
+ @ApiModelProperty("预计报废时间")
+ private LocalDateTime expectedScrapTime;
+
+ @ApiModelProperty("实际报废时间")
+ private LocalDateTime actualScrapTime;
+
+ @ApiModelProperty("状态变更时间")
+ private LocalDateTime statusChangeTime;
+
+ @ApiModelProperty("采购订单")
+ private String purchaseOrder;
+
+ @ApiModelProperty("供应商名称")
+ private String supplierName;
+
+ // 移除采购价格字段,使用单价和总价替代
+ // @ApiModelProperty("采购价格")
+ // private BigDecimal purchasePrice;
+
+ @ApiModelProperty("当前净值")
+ private BigDecimal currentNetValue;
+
+ @ApiModelProperty("折旧方法")
+ private String depreciationMethod;
+
+ @ApiModelProperty("折旧年限")
+ private Integer depreciationYears;
+
+ @ApiModelProperty("残值")
+ private BigDecimal salvageValue;
+
+ @ApiModelProperty("保修截止日期")
+ private LocalDateTime warrantyExpireDate;
+
+ @ApiModelProperty("上次维护日期")
+ private LocalDateTime lastMaintenanceDate;
+
+ @ApiModelProperty("下次维护日期")
+ private LocalDateTime nextMaintenanceDate;
+
+ @ApiModelProperty("维护人员")
+ private String maintenancePerson;
+
+ @ApiModelProperty("库存条码")
+ private String inventoryBarcode;
+
+ @ApiModelProperty("资产备注")
+ private String assetRemark;
+
+ @ApiModelProperty("次户号")
+ private String accountNumber;
+
+ @ApiModelProperty("数量")
+ private Integer quantity;
+
+ @ApiModelProperty("单价")
+ private BigDecimal unitPrice;
+
+ @ApiModelProperty("总价")
+ private BigDecimal totalPrice;
+
+ // 移除备用状态字段,使用现有的 location_status 字段
+ // @ApiModelProperty("备用状态")
+ // private String spareStatus;
+
+ @ApiModelProperty("盘点依据")
+ private String inventoryBasis;
+
+ @ApiModelProperty("动态记录")
+ private String dynamicRecord;
+
+ // 移除认证状态字段,使用现有的 health_status 字段
+ // @ApiModelProperty("认证状态")
+ // private String certificationStatus;
+
+ @ApiModelProperty("使用部门/人")
+ private String usingDepartment;
+
+ @ApiModelProperty("领用时间")
+ private LocalDateTime borrowingTime;
+
+ @ApiModelProperty("归还时间")
+ private LocalDateTime returnTime;
+
+ @ApiModelProperty("出库时间")
+ private LocalDateTime outStockTime;
+
+ @ApiModelProperty("总使用时间")
+ private String totalUsageTime;
+
+ @ApiModelProperty("折旧率")
+ private BigDecimal depreciationRate;
+
+ @ApiModelProperty("折旧方法说明")
+ private String depreciationMethodDesc;
+
+ @ApiModelProperty("发票")
+ private String invoice;
+
+ @ApiModelProperty("发票状态")
+ private String invoiceStatus;
+
+ @ApiModelProperty("附件")
+ private String attachments;
+
+ @ApiModelProperty("照片")
+ private String photos;
+
+ @ApiModelProperty("条码")
+ private String barcode;
+
+ @ApiModelProperty("导入人")
+ private String importer;
+
+ @ApiModelProperty("盘库时间/状态1")
+ private String inventoryTimeStatus1;
+
+ @ApiModelProperty("盘库时间/状态2")
+ private String inventoryTimeStatus2;
+
+ @ApiModelProperty("盘库时间/状态3")
+ private String inventoryTimeStatus3;
+
+ @ApiModelProperty("盘点时间/状态1")
+ private String inventoryCheckTimeStatus1;
+
+ @ApiModelProperty("盘点时间/状态2")
+ private String inventoryCheckTimeStatus2;
+
+ @ApiModelProperty("盘点时间/状态3")
+ private String inventoryCheckTimeStatus3;
+
@ApiModelProperty("当前使用记录id")
@TableField(updateStrategy = FieldStrategy.ALWAYS)
private String useRecordId;
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/PostEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/PostEntity.java
index f19d72e..dcfcdb9 100644
--- a/core/src/main/java/com/dite/znpt/domain/entity/PostEntity.java
+++ b/core/src/main/java/com/dite/znpt/domain/entity/PostEntity.java
@@ -1,6 +1,5 @@
package com.dite.znpt.domain.entity;
-import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -13,6 +12,7 @@ import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.io.Serializable;
+import java.time.LocalDateTime;
/**
* @author Bear.G
@@ -50,4 +50,32 @@ public class PostEntity extends AuditableEntity implements Serializable {
@ApiModelProperty("备注")
@TableField("remark")
private String remark;
+
+ @ApiModelProperty("创建时间")
+ @TableField("create_time")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("更新时间")
+ @TableField("update_time")
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty("岗位说明")
+ @TableField("statement")
+ private String statement;
+
+ @ApiModelProperty("岗位任务")
+ @TableField("responsibilities_task")
+ private String responsibilitiesTask;
+
+ @ApiModelProperty("岗位任职资格")
+ @TableField("qualifications")
+ private String qualifications;
+
+ @ApiModelProperty("岗位工作条件")
+ @TableField("working_conditions")
+ private String workingConditions;
+
+ @ApiModelProperty("岗位薪资")
+ @TableField("salary")
+ private Double salary;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectBudgetInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectBudgetInfoEntity.java
index 7b5e4bb..83be724 100644
--- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectBudgetInfoEntity.java
+++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectBudgetInfoEntity.java
@@ -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;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java
index 718558f..943620b 100644
--- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java
+++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java
@@ -33,6 +33,16 @@ public class ProjectEntity extends AuditableEntity implements Serializable {
@TableId(value = "project_id", type = IdType.ASSIGN_UUID)
private String projectId;
+ @ExcelProperty("项目来源")
+ @ApiModelProperty("项目来源")
+ @TableField("project_origin")
+ private String projectOrigin;
+
+ @ExcelProperty("项目预算")
+ @ApiModelProperty("项目预算")
+ @TableField("project_budget")
+ private Integer projectBudget;
+
@ExcelProperty("项目名称")
@ApiModelProperty("项目名称")
@TableField("project_name")
@@ -169,5 +179,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;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java
index 6dd36f1..e3519a0 100644
--- a/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java
+++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java
@@ -1,12 +1,15 @@
package com.dite.znpt.domain.entity;
-import com.baomidou.mybatisplus.annotation.*;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
import com.dite.znpt.domain.AuditableEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
-import com.alibaba.excel.annotation.ExcelProperty;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -39,9 +42,7 @@ public class RegulationEntity extends AuditableEntity implements Serializable {
@TableField("content")
private String content;
- @ExcelProperty("制度类型")
- @ApiModelProperty("制度类型")
- @TableField("regulation_type")
+ @TableField(exist = false)
private String type;
@ExcelProperty("制度状态")
@@ -97,7 +98,8 @@ public class RegulationEntity extends AuditableEntity implements Serializable {
@ApiModelProperty("创建人姓名")
private String createByName;
- @TableField(exist = false)
+ @ExcelProperty("制度类型")
@ApiModelProperty("制度类型")
+ @TableField("regulation_type")
private String regulationType;
}
\ No newline at end of file
diff --git a/core/src/main/java/com/dite/znpt/domain/page/PageBean.java b/core/src/main/java/com/dite/znpt/domain/page/PageBean.java
new file mode 100644
index 0000000..5a2992b
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/page/PageBean.java
@@ -0,0 +1,15 @@
+package com.dite.znpt.domain.page;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class PageBean {
+ private Long total;
+ private List> rows;
+}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ContractListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ContractListReq.java
index fa58191..facfb38 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ContractListReq.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ContractListReq.java
@@ -7,7 +7,6 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
-import java.util.Date;
/**
* @author huise23
@@ -42,9 +41,6 @@ public class ContractListReq implements Serializable {
@ApiModelProperty("部门id")
private String departmentId;
- @ApiModelProperty("签订日期")
- private Date signDate;
-
@ApiModelProperty("期限")
private String duration;
@@ -54,12 +50,6 @@ public class ContractListReq implements Serializable {
@ApiModelProperty("产品或服务")
private String productService;
- @ApiModelProperty("付款日期/交付日期")
- private Date paymentDate;
-
- @ApiModelProperty("履约时间期限")
- private Date performanceDeadline;
-
@ApiModelProperty("付款地址/交付地址")
private String paymentAddress;
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ContractResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ContractResp.java
index f21e2ca..a1f4ff0 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ContractResp.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ContractResp.java
@@ -1,15 +1,12 @@
package com.dite.znpt.domain.vo;
-import java.math.BigDecimal;
-import java.util.Date;
-
-import com.alibaba.excel.annotation.ExcelProperty;
-import com.baomidou.mybatisplus.annotation.TableField;
+import com.dite.znpt.domain.entity.ContractEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
-import com.dite.znpt.domain.entity.ContractEntity;
+
+import java.math.BigDecimal;
/**
* @author huise23
@@ -35,5 +32,8 @@ public class ContractResp extends ContractEntity {
@ApiModelProperty("已收款金额")
private BigDecimal receivedAmount;
+
+ @ApiModelProperty("合同状态名称")
+ private String contractStatusLabel;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java
index 36d9cfc..d746d98 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java
@@ -6,6 +6,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
+import java.time.LocalDateTime;
/**
* @author Bear.G
@@ -26,4 +27,154 @@ public class EquipmentListReq implements Serializable {
@ApiModelProperty("设备状态,0-空闲中,1-使用,3-保养中,4-维修中,5-已报废")
private String equipmentStatus;
+
+ @ApiModelProperty("设备序列号")
+ private String equipmentSn;
+
+ @ApiModelProperty("资产编号")
+ private String assetCode;
+
+ @ApiModelProperty("品牌")
+ private String brand;
+
+ @ApiModelProperty("位置状态")
+ private String locationStatus;
+
+ @ApiModelProperty("健康状态")
+ private String healthStatus;
+
+ @ApiModelProperty("负责人")
+ private String responsiblePerson;
+
+ @ApiModelProperty("使用状态,0-空闲中,1-使用中")
+ private String useStatus;
+
+ @ApiModelProperty("项目ID")
+ private String projectId;
+
+ @ApiModelProperty("用户ID")
+ private String userId;
+
+ @ApiModelProperty("设备型号")
+ private String equipmentModel;
+
+ @ApiModelProperty("配置规格/参数")
+ private String specification;
+
+ @ApiModelProperty("设备当前物理位置")
+ private String physicalLocation;
+
+ @ApiModelProperty("供应商名称")
+ private String supplierName;
+
+ @ApiModelProperty("采购订单号")
+ private String purchaseOrder;
+
+ @ApiModelProperty("维护人员")
+ private String maintenancePerson;
+
+ @ApiModelProperty("次户号")
+ private String accountNumber;
+
+ @ApiModelProperty("数量")
+ private Integer quantity;
+
+ @ApiModelProperty("单价")
+ private java.math.BigDecimal unitPrice;
+
+ @ApiModelProperty("总价")
+ private java.math.BigDecimal totalPrice;
+
+ @ApiModelProperty("盘点依据")
+ private String inventoryBasis;
+
+ @ApiModelProperty("动态记录")
+ private String dynamicRecord;
+
+ @ApiModelProperty("库存条码")
+ private String inventoryBarcode;
+
+ @ApiModelProperty("资产备注")
+ private String assetRemark;
+
+ @ApiModelProperty("使用部门/人")
+ private String usingDepartment;
+
+ @ApiModelProperty("发票")
+ private String invoice;
+
+ @ApiModelProperty("条码")
+ private String barcode;
+
+ @ApiModelProperty("导入人")
+ private String importer;
+
+ @ApiModelProperty("采购时间开始")
+ private LocalDateTime purchaseTimeStart;
+
+ @ApiModelProperty("采购时间结束")
+ private LocalDateTime purchaseTimeEnd;
+
+ @ApiModelProperty("入库时间开始")
+ private LocalDateTime inStockTimeStart;
+
+ @ApiModelProperty("入库时间结束")
+ private LocalDateTime inStockTimeEnd;
+
+ @ApiModelProperty("启用时间开始")
+ private LocalDateTime activationTimeStart;
+
+ @ApiModelProperty("启用时间结束")
+ private LocalDateTime activationTimeEnd;
+
+ @ApiModelProperty("预计报废时间开始")
+ private LocalDateTime expectedScrapTimeStart;
+
+ @ApiModelProperty("预计报废时间结束")
+ private LocalDateTime expectedScrapTimeEnd;
+
+ @ApiModelProperty("保修截止日期开始")
+ private LocalDateTime warrantyExpireDateStart;
+
+ @ApiModelProperty("保修截止日期结束")
+ private LocalDateTime warrantyExpireDateEnd;
+
+ @ApiModelProperty("上次维护日期开始")
+ private LocalDateTime lastMaintenanceDateStart;
+
+ @ApiModelProperty("上次维护日期结束")
+ private LocalDateTime lastMaintenanceDateEnd;
+
+ @ApiModelProperty("下次维护日期开始")
+ private LocalDateTime nextMaintenanceDateStart;
+
+ @ApiModelProperty("下次维护日期结束")
+ private LocalDateTime nextMaintenanceDateEnd;
+
+ @ApiModelProperty("创建时间开始")
+ private LocalDateTime createTimeStart;
+
+ @ApiModelProperty("创建时间结束")
+ private LocalDateTime createTimeEnd;
+
+ @ApiModelProperty("更新时间开始")
+ private LocalDateTime updateTimeStart;
+
+ @ApiModelProperty("更新时间结束")
+ private LocalDateTime updateTimeEnd;
+
+ @ApiModelProperty("当前页码")
+ private Integer pageNum;
+
+ @ApiModelProperty("每页大小")
+ private Integer pageSize;
+
+ @ApiModelProperty("排序字段")
+ private String orderBy;
+
+ @ApiModelProperty("排序方向")
+ private String orderDirection;
+
+ @ApiModelProperty("页码")
+ private Integer page;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java
index db16ba9..202d213 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java
@@ -8,6 +8,8 @@ import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serial;
import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
/**
* @author Bear.G
@@ -22,7 +24,7 @@ public class EquipmentReq implements Serializable {
@ApiModelProperty("设备名称")
@NotBlank(message = "设备名称不能为空")
- @Size(max = 100, message = "设备名称长度不能超过100个字")
+ @Size(max = 200, message = "设备名称长度不能超过200个字")
private String equipmentName;
@ApiModelProperty("设备类型, 枚举:EquipmentTypeEnum")
@@ -31,11 +33,204 @@ public class EquipmentReq implements Serializable {
@ApiModelProperty("设备型号")
@NotBlank(message = "设备型号不能为空")
- @Size(max = 50, message = "设备型号长度不能超过50个字")
+ @Size(max = 200, message = "设备型号长度不能超过200个字")
private String equipmentModel;
@ApiModelProperty("设备SN")
@NotBlank(message = "设备SN不能为空")
- @Size(max = 50, message = "设备SN长度不能超过50个字")
+ @Size(max = 100, message = "设备SN长度不能超过100个字")
private String equipmentSn;
+
+ @ApiModelProperty("资产编号")
+ @Size(max = 50, message = "资产编号长度不能超过50个字")
+ private String assetCode;
+
+ @ApiModelProperty("品牌")
+ @Size(max = 100, message = "品牌长度不能超过100个字")
+ private String brand;
+
+ @ApiModelProperty("配置规格/参数")
+ @Size(max = 500, message = "配置规格长度不能超过500个字")
+ private String specification;
+
+ @ApiModelProperty("设备状态,枚举:EquipmentStatusEnum")
+ private String equipmentStatus;
+
+ @ApiModelProperty("使用状态,0-空闲中,1-使用中")
+ private String useStatus;
+
+ @ApiModelProperty("位置状态")
+ private String locationStatus;
+
+ @ApiModelProperty("设备当前物理位置")
+ @Size(max = 200, message = "物理位置长度不能超过200个字")
+ private String physicalLocation;
+
+ @ApiModelProperty("负责人")
+ @Size(max = 100, message = "负责人长度不能超过100个字")
+ private String responsiblePerson;
+
+ @ApiModelProperty("健康状态")
+ private String healthStatus;
+
+ @ApiModelProperty("采购时间")
+ private LocalDateTime purchaseTime;
+
+ @ApiModelProperty("入库时间")
+ private LocalDateTime inStockTime;
+
+ @ApiModelProperty("启用时间")
+ private LocalDateTime activationTime;
+
+ @ApiModelProperty("预计报废时间")
+ private LocalDateTime expectedScrapTime;
+
+ @ApiModelProperty("实际报废时间")
+ private LocalDateTime actualScrapTime;
+
+ @ApiModelProperty("状态变更时间")
+ private LocalDateTime statusChangeTime;
+
+ @ApiModelProperty("采购订单")
+ @Size(max = 100, message = "采购订单长度不能超过100个字")
+ private String purchaseOrder;
+
+ @ApiModelProperty("供应商名称")
+ @Size(max = 200, message = "供应商名称长度不能超过200个字")
+ private String supplierName;
+
+ // 移除采购价格字段,使用单价和总价替代
+ // @ApiModelProperty("采购价格")
+ // private BigDecimal purchasePrice;
+
+ @ApiModelProperty("当前净值")
+ private BigDecimal currentNetValue;
+
+ @ApiModelProperty("折旧方法")
+ private String depreciationMethod;
+
+ @ApiModelProperty("折旧年限")
+ private Integer depreciationYears;
+
+ @ApiModelProperty("残值")
+ private BigDecimal salvageValue;
+
+ @ApiModelProperty("保修截止日期")
+ private LocalDateTime warrantyExpireDate;
+
+ @ApiModelProperty("上次维护日期")
+ private LocalDateTime lastMaintenanceDate;
+
+ @ApiModelProperty("下次维护日期")
+ private LocalDateTime nextMaintenanceDate;
+
+ @ApiModelProperty("维护人员")
+ @Size(max = 100, message = "维护人员长度不能超过100个字")
+ private String maintenancePerson;
+
+ @ApiModelProperty("库存条码")
+ @Size(max = 100, message = "库存条码长度不能超过100个字")
+ private String inventoryBarcode;
+
+ @ApiModelProperty("资产备注")
+ @Size(max = 1000, message = "资产备注长度不能超过1000个字")
+ private String assetRemark;
+
+ @ApiModelProperty("次户号")
+ private String accountNumber;
+
+ @ApiModelProperty("数量")
+ private Integer quantity;
+
+ @ApiModelProperty("单价")
+ private BigDecimal unitPrice;
+
+ @ApiModelProperty("总价")
+ private BigDecimal totalPrice;
+
+ // 移除备用状态字段,使用现有的 location_status 字段
+ // @ApiModelProperty("备用状态")
+ // private String spareStatus;
+
+ @ApiModelProperty("盘点依据")
+ private String inventoryBasis;
+
+ @ApiModelProperty("动态记录")
+ private String dynamicRecord;
+
+ // 移除认证状态字段,使用现有的 health_status 字段
+ // @ApiModelProperty("认证状态")
+ // private String certificationStatus;
+
+ @ApiModelProperty("使用部门/人")
+ @Size(max = 200, message = "使用部门/人长度不能超过200个字")
+ private String usingDepartment;
+
+ @ApiModelProperty("领用时间")
+ private LocalDateTime borrowingTime;
+
+ @ApiModelProperty("归还时间")
+ private LocalDateTime returnTime;
+
+ @ApiModelProperty("出库时间")
+ private LocalDateTime outStockTime;
+
+ @ApiModelProperty("总使用时间")
+ @Size(max = 100, message = "总使用时间长度不能超过100个字")
+ private String totalUsageTime;
+
+ @ApiModelProperty("折旧率")
+ private BigDecimal depreciationRate;
+
+ @ApiModelProperty("折旧方法说明")
+ @Size(max = 500, message = "折旧方法说明长度不能超过500个字")
+ private String depreciationMethodDesc;
+
+ @ApiModelProperty("发票")
+ @Size(max = 100, message = "发票长度不能超过100个字")
+ private String invoice;
+
+ @ApiModelProperty("发票状态")
+ @Size(max = 50, message = "发票状态长度不能超过50个字")
+ private String invoiceStatus;
+
+ @ApiModelProperty("附件")
+ @Size(max = 500, message = "附件长度不能超过500个字")
+ private String attachments;
+
+ @ApiModelProperty("照片")
+ @Size(max = 500, message = "照片长度不能超过500个字")
+ private String photos;
+
+ @ApiModelProperty("条码")
+ @Size(max = 100, message = "条码长度不能超过100个字")
+ private String barcode;
+
+ @ApiModelProperty("导入人")
+ @Size(max = 100, message = "导入人长度不能超过100个字")
+ private String importer;
+
+ @ApiModelProperty("盘库时间/状态1")
+ @Size(max = 100, message = "盘库时间/状态1长度不能超过100个字")
+ private String inventoryTimeStatus1;
+
+ @ApiModelProperty("盘库时间/状态2")
+ @Size(max = 100, message = "盘库时间/状态2长度不能超过100个字")
+ private String inventoryTimeStatus2;
+
+ @ApiModelProperty("盘库时间/状态3")
+ @Size(max = 100, message = "盘库时间/状态3长度不能超过100个字")
+ private String inventoryTimeStatus3;
+
+ @ApiModelProperty("盘点时间/状态1")
+ @Size(max = 100, message = "盘点时间/状态1长度不能超过100个字")
+ private String inventoryCheckTimeStatus1;
+
+ @ApiModelProperty("盘点时间/状态2")
+ @Size(max = 100, message = "盘点时间/状态2长度不能超过100个字")
+ private String inventoryCheckTimeStatus2;
+
+ @ApiModelProperty("盘点时间/状态3")
+ @Size(max = 100, message = "盘点时间/状态3长度不能超过100个字")
+ private String inventoryCheckTimeStatus3;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java
index 335a532..4aac551 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java
@@ -6,6 +6,8 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
/**
* @author Bear.G
@@ -21,6 +23,9 @@ public class EquipmentResp implements Serializable {
@ApiModelProperty("设备ID")
private String equipmentId;
+ @ApiModelProperty("资产编号")
+ private String assetCode;
+
@ApiModelProperty("设备名称")
private String equipmentName;
@@ -36,6 +41,12 @@ public class EquipmentResp implements Serializable {
@ApiModelProperty("设备SN")
private String equipmentSn;
+ @ApiModelProperty("品牌")
+ private String brand;
+
+ @ApiModelProperty("配置规格/参数")
+ private String specification;
+
@ApiModelProperty("设备状态, 枚举:EquipmentStatusEnum")
private String equipmentStatus;
@@ -45,6 +56,171 @@ public class EquipmentResp implements Serializable {
@ApiModelProperty("设备使用状态,0-空闲中,1-使用中")
private String useStatus;
+ @ApiModelProperty("位置状态")
+ private String locationStatus;
+
+ @ApiModelProperty("位置状态描述")
+ private String locationStatusLabel;
+
+ @ApiModelProperty("设备当前物理位置")
+ private String physicalLocation;
+
+ @ApiModelProperty("负责人")
+ private String responsiblePerson;
+
+ @ApiModelProperty("健康状态")
+ private String healthStatus;
+
+ @ApiModelProperty("健康状态描述")
+ private String healthStatusLabel;
+
+ @ApiModelProperty("采购时间")
+ private LocalDateTime purchaseTime;
+
+ @ApiModelProperty("入库时间")
+ private LocalDateTime inStockTime;
+
+ @ApiModelProperty("启用时间")
+ private LocalDateTime activationTime;
+
+ @ApiModelProperty("预计报废时间")
+ private LocalDateTime expectedScrapTime;
+
+ @ApiModelProperty("实际报废时间")
+ private LocalDateTime actualScrapTime;
+
+ @ApiModelProperty("状态变更时间")
+ private LocalDateTime statusChangeTime;
+
+ @ApiModelProperty("采购订单")
+ private String purchaseOrder;
+
+ @ApiModelProperty("供应商名称")
+ private String supplierName;
+
+ // 移除采购价格字段,使用单价和总价替代
+ // @ApiModelProperty("采购价格")
+ // private BigDecimal purchasePrice;
+
+ @ApiModelProperty("当前净值")
+ private BigDecimal currentNetValue;
+
+ @ApiModelProperty("折旧方法")
+ private String depreciationMethod;
+
+ @ApiModelProperty("折旧年限")
+ private Integer depreciationYears;
+
+ @ApiModelProperty("残值")
+ private BigDecimal salvageValue;
+
+ @ApiModelProperty("保修截止日期")
+ private LocalDateTime warrantyExpireDate;
+
+ @ApiModelProperty("上次维护日期")
+ private LocalDateTime lastMaintenanceDate;
+
+ @ApiModelProperty("下次维护日期")
+ private LocalDateTime nextMaintenanceDate;
+
+ @ApiModelProperty("维护人员")
+ private String maintenancePerson;
+
+ @ApiModelProperty("库存条码")
+ private String inventoryBarcode;
+
+ @ApiModelProperty("资产备注")
+ private String assetRemark;
+
+ @ApiModelProperty("次户号")
+ private String accountNumber;
+
+ @ApiModelProperty("数量")
+ private Integer quantity;
+
+ @ApiModelProperty("单价")
+ private BigDecimal unitPrice;
+
+ @ApiModelProperty("总价")
+ private BigDecimal totalPrice;
+
+ // 移除备用状态字段,使用现有的 location_status 字段
+ // @ApiModelProperty("备用状态")
+ // private String spareStatus;
+
+ // @ApiModelProperty("备用状态描述")
+ // private String spareStatusLabel;
+
+ @ApiModelProperty("盘点依据")
+ private String inventoryBasis;
+
+ @ApiModelProperty("动态记录")
+ private String dynamicRecord;
+
+ // 移除认证状态字段,使用现有的 health_status 字段
+ // @ApiModelProperty("认证状态")
+ // private String certificationStatus;
+
+ // @ApiModelProperty("认证状态描述")
+ // private String certificationStatusLabel;
+
+ @ApiModelProperty("使用部门/人")
+ private String usingDepartment;
+
+ @ApiModelProperty("领用时间")
+ private LocalDateTime borrowingTime;
+
+ @ApiModelProperty("归还时间")
+ private LocalDateTime returnTime;
+
+ @ApiModelProperty("出库时间")
+ private LocalDateTime outStockTime;
+
+ @ApiModelProperty("总使用时间")
+ private String totalUsageTime;
+
+ @ApiModelProperty("折旧率")
+ private BigDecimal depreciationRate;
+
+ @ApiModelProperty("折旧方法说明")
+ private String depreciationMethodDesc;
+
+ @ApiModelProperty("发票")
+ private String invoice;
+
+ @ApiModelProperty("发票状态")
+ private String invoiceStatus;
+
+ @ApiModelProperty("附件")
+ private String attachments;
+
+ @ApiModelProperty("照片")
+ private String photos;
+
+ @ApiModelProperty("条码")
+ private String barcode;
+
+ @ApiModelProperty("导入人")
+ private String importer;
+
+ @ApiModelProperty("盘库时间/状态1")
+ private String inventoryTimeStatus1;
+
+ @ApiModelProperty("盘库时间/状态2")
+ private String inventoryTimeStatus2;
+
+ @ApiModelProperty("盘库时间/状态3")
+ private String inventoryTimeStatus3;
+
+ @ApiModelProperty("盘点时间/状态1")
+ private String inventoryCheckTimeStatus1;
+
+ @ApiModelProperty("盘点时间/状态2")
+ private String inventoryCheckTimeStatus2;
+
+ @ApiModelProperty("盘点时间/状态3")
+ private String inventoryCheckTimeStatus3;
+
@ApiModelProperty("项目id")
private String projectId;
@@ -56,4 +232,10 @@ public class EquipmentResp implements Serializable {
@ApiModelProperty("使用人")
private String name;
+
+ @ApiModelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("更新时间")
+ private LocalDateTime updateTime;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PostReq.java b/core/src/main/java/com/dite/znpt/domain/vo/PostReq.java
index fc4df93..55371d5 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/PostReq.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/PostReq.java
@@ -33,9 +33,24 @@ public class PostReq implements Serializable {
@ApiModelProperty("显示顺序")
private Integer postSort;
- @ApiModelProperty("状态(0正常 1停用)")
+ @ApiModelProperty("状态(0停用 1正常)")
private Integer status;
@ApiModelProperty("备注")
private String remark;
+
+ @ApiModelProperty("岗位说明")
+ private String statement;
+
+ @ApiModelProperty("岗位任务")
+ private String responsibilitiesTask;
+
+ @ApiModelProperty("岗位任职资格")
+ private String qualifications;
+
+ @ApiModelProperty("岗位工作条件")
+ private String workingConditions;
+
+ @ApiModelProperty("岗位薪资")
+ private Double salary;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/PostResp.java b/core/src/main/java/com/dite/znpt/domain/vo/PostResp.java
index ae7eaf2..47c25ad 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/PostResp.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/PostResp.java
@@ -7,6 +7,7 @@ import lombok.Data;
import javax.validation.constraints.Size;
import java.io.Serial;
import java.io.Serializable;
+import java.time.LocalDateTime;
/**
* @author Bear.G
@@ -41,4 +42,25 @@ public class PostResp implements Serializable {
@ApiModelProperty("备注")
private String remark;
+ @ApiModelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("更新时间")
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty("岗位说明")
+ private String statement;
+
+ @ApiModelProperty("岗位任务")
+ private String responsibilitiesTask;
+
+ @ApiModelProperty("岗位任职资格")
+ private String qualifications;
+
+ @ApiModelProperty("岗位工作条件")
+ private String workingConditions;
+
+ @ApiModelProperty("岗位薪资")
+ private Double salary;
+
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoDetailResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoDetailResp.java
new file mode 100644
index 0000000..1216dcc
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoDetailResp.java
@@ -0,0 +1,57 @@
+package com.dite.znpt.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+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;
+}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java
new file mode 100644
index 0000000..ec8918f
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java
@@ -0,0 +1,37 @@
+package com.dite.znpt.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+/**
+ * @author huise23
+ * @date 2025/07/17 21:58
+ * @Description: 项目预算信息表导入请求类
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="ProjectBudgetInfo导入请求对象", description="项目预算信息表")
+public class ProjectBudgetInfoImportReq implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 580212651388155611L;
+
+ @ExcelProperty(value = "项目Id")
+ private String projectId;
+
+ @ExcelProperty(value = "预算名称")
+ private String budgetName;
+
+ @ExcelProperty(value = "预算花费金额")
+ private Double budgetAmount;
+
+ @ExcelProperty(value = "预算说明")
+ private String budgetDesc;
+
+ @ExcelProperty(value = "附件")
+ private String attach;
+}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListReq.java
index 047b5e9..0188223 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListReq.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListReq.java
@@ -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;
-
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListResp.java
index af0e31b..17abe5d 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListResp.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoListResp.java
@@ -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;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoReq.java
index 60caa06..27998c3 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoReq.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoReq.java
@@ -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;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoResp.java
index 70b2d3f..fed9529 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoResp.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoResp.java
@@ -15,8 +15,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@ApiModel("项目预算信息响应实体")
public class ProjectBudgetInfoResp extends ProjectBudgetInfoEntity {
-
- @ApiModelProperty("预算类型描述")
- private String budgetTypeDesc;
+ @ApiModelProperty("项目名称")
+ private String projectName;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java
index 2266301..d92ce3a 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java
@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
@@ -70,12 +71,31 @@ public class ProjectDetailResp {
@ApiModelProperty("结束时间")
private LocalDate endDate;
+ @ApiModelProperty("计划开始时间")
+ private LocalDate plannedStartDate;
+
@ApiModelProperty("创建时间")
private String createTime;
@ApiModelProperty("更新时间")
private String updateTime;
+ // 新增字段 - 对应前端ProjectCard接口
+ @ApiModelProperty("项目预算(万元)")
+ private BigDecimal budget;
+
+ @ApiModelProperty("项目经理")
+ private String manager;
+
+ @ApiModelProperty("团队规模")
+ private Integer teamSize;
+
+ @ApiModelProperty("准备进度百分比")
+ private Integer preparationProgress;
+
+ @ApiModelProperty("项目进度百分比")
+ private Integer progress;
+
// 项目人员信息(从新关联表获取)
@ApiModelProperty("项目人员列表")
private List projectMembers;
@@ -152,9 +172,6 @@ public class ProjectDetailResp {
@ApiModelProperty("预算名称")
private String budgetName;
- @ApiModelProperty("预算类型")
- private String budgetType;
-
@ApiModelProperty("预算金额(万元)")
private Double budgetAmount;
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java
index f80c696..2e7e598 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java
@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
@@ -71,6 +72,9 @@ public class ProjectKanbanDataResp {
@ApiModelProperty("结束时间")
private LocalDate endDate;
+ @ApiModelProperty("计划开始时间")
+ private LocalDate plannedStartDate;
+
@ApiModelProperty("项目经理")
private String projectManagerName;
@@ -103,5 +107,67 @@ public class ProjectKanbanDataResp {
@ApiModelProperty("更新时间")
private String updateTime;
+
+ // 新增字段 - 对应前端ProjectCard接口
+ @ApiModelProperty("项目预算(万元)")
+ private BigDecimal budget;
+
+ @ApiModelProperty("项目经理")
+ private String manager;
+
+ @ApiModelProperty("团队规模")
+ private Integer teamSize;
+
+ @ApiModelProperty("准备进度百分比")
+ private Integer preparationProgress;
+
+ @ApiModelProperty("项目进度百分比")
+ private Integer progress;
+
+ @ApiModelProperty("团队成员列表")
+ private List teamMembers;
+
+ @Data
+ @ApiModel(value="TeamMemberResp对象", description="团队成员响应")
+ public static class TeamMemberResp {
+ @ApiModelProperty("成员ID")
+ private String memberId;
+
+ @ApiModelProperty("用户ID")
+ private String userId;
+
+ @ApiModelProperty("用户姓名")
+ private String userName;
+
+ @ApiModelProperty("用户账号")
+ private String userAccount;
+
+ @ApiModelProperty("用户头像")
+ private String userAvatar;
+
+ @ApiModelProperty("角色类型")
+ private String roleType;
+
+ @ApiModelProperty("角色类型描述")
+ private String roleTypeDesc;
+
+ @ApiModelProperty("岗位代码")
+ private String jobCode;
+
+ @ApiModelProperty("岗位代码描述")
+ private String jobCodeDesc;
+
+ @ApiModelProperty("岗位描述")
+ private String jobDesc;
+
+ @ApiModelProperty("加入时间")
+ private LocalDate joinDate;
+
+ @ApiModelProperty("离开时间")
+ private LocalDate leaveDate;
+
+ @ApiModelProperty("状态")
+ private String status;
+ }
}
}
\ No newline at end of file
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java
index a285e33..02b087c 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListReq.java
@@ -1,7 +1,5 @@
package com.dite.znpt.domain.vo;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -23,6 +21,12 @@ public class ProjectListReq implements Serializable {
@ApiModelProperty("项目名称")
private String projectName;
+ @ApiModelProperty(value = "项目来源")
+ private String projectOrigin;
+
+ @ApiModelProperty(value = "项目预算")
+ private Integer projectBudget;
+
@ApiModelProperty("风场名称")
private String farmName;
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java
index f0578ef..61faa9b 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectListResp.java
@@ -1,10 +1,5 @@
package com.dite.znpt.domain.vo;
-import com.alibaba.excel.annotation.ExcelProperty;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -12,7 +7,6 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
-import java.time.LocalDateTime;
/**
* @Author: gaoxiong
@@ -31,6 +25,12 @@ public class ProjectListResp implements Serializable {
@ApiModelProperty("项目名称")
private String projectName;
+ @ApiModelProperty(value = "项目来源")
+ private String projectOrigin;
+
+ @ApiModelProperty(value = "项目预算")
+ private Integer projectBudget;
+
@ApiModelProperty("风场名称")
private String farmName;
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java
index 501ac49..5fdcc16 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectReq.java
@@ -1,6 +1,5 @@
package com.dite.znpt.domain.vo;
-import com.alibaba.excel.annotation.ExcelProperty;
import com.dite.znpt.util.ValidationGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -28,6 +27,14 @@ public class ProjectReq implements Serializable {
@ApiModelProperty("项目id")
private String projectId;
+ @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目来源不能为空")
+ @ApiModelProperty("项目来源")
+ private String projectOrigin;
+
+ @NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目预算不能为空")
+ @ApiModelProperty("项目预算")
+ private Integer projectBudget;
+
@NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目名称不能为空")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "项目名称长度不能超过50字符")
@ApiModelProperty("项目名称")
@@ -105,4 +112,19 @@ public class ProjectReq 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;
}
diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java
index 826a0f5..16eb289 100644
--- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java
+++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectResp.java
@@ -1,19 +1,11 @@
package com.dite.znpt.domain.vo;
-import com.alibaba.excel.annotation.ExcelProperty;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import lombok.EqualsAndHashCode;
-import com.dite.znpt.domain.entity.ProjectEntity;
import java.io.Serial;
import java.io.Serializable;
-import java.time.LocalDate;
/**
* @author huise23
@@ -27,6 +19,15 @@ public class ProjectResp extends ProjectReq implements Serializable {
@Serial
private static final long serialVersionUID = -1883901559600186726L;
+ @ApiModelProperty("项目ID")
+ private String projectId;
+
+ @ApiModelProperty("项目来源")
+ private String projectOrigin;
+
+ @ApiModelProperty("项目预算")
+ private Integer projectBudget;
+
@ApiModelProperty("施工人员")
private String constructorName;
diff --git a/core/src/main/java/com/dite/znpt/enums/ContractStatusEnum.java b/core/src/main/java/com/dite/znpt/enums/ContractStatusEnum.java
new file mode 100644
index 0000000..0ba6bc0
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/enums/ContractStatusEnum.java
@@ -0,0 +1,54 @@
+package com.dite.znpt.enums;
+
+import cn.hutool.json.JSONObject;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Bear.G
+ * @date 2025/5/27/周二 15:33
+ * @description
+ */
+@Getter
+public enum ContractStatusEnum {
+
+ UN_APPROVAL("UN_APPROVAL", "待审批"),
+ UN_SETTLED("UN_SETTLED", "待结算"),
+ UN_PAY("UN_PAY", "待收款"),
+ COMPLETE("COMPLETE", "已完成"),
+ ;
+
+ private final String code;
+ private final String desc;
+
+ ContractStatusEnum(String code, String desc){
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public static ContractStatusEnum getByCode(String code){
+ for (ContractStatusEnum e : ContractStatusEnum.values() ) {
+ if(e.code.equals(code)){
+ return e;
+ }
+ }
+ return null;
+ }
+
+ public static String getDescByCode(String code){
+ ContractStatusEnum e = getByCode(code);
+ return null == e ? null : e.desc;
+ }
+
+ public static List listAll(){
+ List list = new ArrayList<>(ContractStatusEnum.values().length);
+ for (ContractStatusEnum e : ContractStatusEnum.values() ) {
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.set(e.code, e.desc);
+ list.add(jsonObject);
+ }
+ return list;
+ }
+}
diff --git a/core/src/main/java/com/dite/znpt/enums/HealthStatusEnum.java b/core/src/main/java/com/dite/znpt/enums/HealthStatusEnum.java
new file mode 100644
index 0000000..7b437d9
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/enums/HealthStatusEnum.java
@@ -0,0 +1,53 @@
+package com.dite.znpt.enums;
+
+import cn.hutool.json.JSONObject;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Bear.G
+ * @date 2025/7/31/周四 15:30
+ * @description 设备健康状态枚举
+ */
+@Getter
+public enum HealthStatusEnum {
+ EXCELLENT("excellent", "优秀"),
+ GOOD("good", "良好"),
+ NORMAL("normal", "一般"),
+ POOR("poor", "较差"),
+ BAD("bad", "差");
+
+ private final String code;
+ private final String desc;
+
+ HealthStatusEnum(String code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public static HealthStatusEnum getByCode(String code) {
+ for (HealthStatusEnum e : HealthStatusEnum.values()) {
+ if (e.code.equals(code)) {
+ return e;
+ }
+ }
+ return null;
+ }
+
+ public static String getDescByCode(String code) {
+ HealthStatusEnum e = getByCode(code);
+ return null == e ? null : e.desc;
+ }
+
+ public static List listAll() {
+ List list = new ArrayList<>(HealthStatusEnum.values().length);
+ for (HealthStatusEnum e : HealthStatusEnum.values()) {
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.set(e.code, e.desc);
+ list.add(jsonObject);
+ }
+ return list;
+ }
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/dite/znpt/enums/LocationStatusEnum.java b/core/src/main/java/com/dite/znpt/enums/LocationStatusEnum.java
new file mode 100644
index 0000000..9e04826
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/enums/LocationStatusEnum.java
@@ -0,0 +1,55 @@
+package com.dite.znpt.enums;
+
+import cn.hutool.json.JSONObject;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Bear.G
+ * @date 2025/7/31/周四 15:30
+ * @description 设备位置状态枚举
+ */
+@Getter
+public enum LocationStatusEnum {
+ IN_STOCK("in_stock", "库存中"),
+ ALLOCATED("allocated", "已分配"),
+ REPAIR("repair", "维修中"),
+ SCRAP("scrap", "待报废"),
+ SCRAPPED("scrapped", "已报废"),
+ BORROWED("borrowed", "外借中"),
+ LOST("lost", "丢失");
+
+ private final String code;
+ private final String desc;
+
+ LocationStatusEnum(String code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public static LocationStatusEnum getByCode(String code) {
+ for (LocationStatusEnum e : LocationStatusEnum.values()) {
+ if (e.code.equals(code)) {
+ return e;
+ }
+ }
+ return null;
+ }
+
+ public static String getDescByCode(String code) {
+ LocationStatusEnum e = getByCode(code);
+ return null == e ? null : e.desc;
+ }
+
+ public static List listAll() {
+ List list = new ArrayList<>(LocationStatusEnum.values().length);
+ for (LocationStatusEnum e : LocationStatusEnum.values()) {
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.set(e.code, e.desc);
+ list.add(jsonObject);
+ }
+ return list;
+ }
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java b/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java
new file mode 100644
index 0000000..6192769
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java
@@ -0,0 +1,20 @@
+package com.dite.znpt.mapper;
+
+import com.dite.znpt.domain.entity.BusinessDataFileEntity;
+import io.swagger.annotations.ApiOperation;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@ApiOperation("商务资料文件对象")
+public interface BusinessDataFileMapper {
+ public List List(@Param("folderId") Long folderId, @Param("fileName") String fileName);
+ void delete(@Param("fileId") Long fileId,@Param("folderId") Long folderId);
+
+ void add(BusinessDataFileEntity businessDataFileEntity);
+
+ String getPath(Long fileId);
+
+ // 在接口中添加重命名方法
+ void reName(@Param("fileId") Long fileId, @Param("newFileName") String newFileName, @Param("newFilePath") String newFilePath);
+}
diff --git a/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java b/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java
new file mode 100644
index 0000000..b92887f
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java
@@ -0,0 +1,26 @@
+package com.dite.znpt.mapper;
+
+import com.dite.znpt.domain.entity.BusinessDataEntity;
+import io.swagger.annotations.ApiOperation;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+
+
+
+
+@ApiOperation("商务资料文件夹对象")
+public interface BusinessDataMapper {
+ public String getPath(Long parentId);
+
+ public List List();
+
+ void insert(BusinessDataEntity businessDataEntity);
+
+ void delete(Long folderId);
+
+ void reName(BusinessDataEntity businessDataEntity);
+
+ public List ListWithCondition(@Param("folderName") String folderName);
+}
diff --git a/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java b/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java
new file mode 100644
index 0000000..5b8d99c
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java
@@ -0,0 +1,27 @@
+package com.dite.znpt.service;
+
+import com.dite.znpt.domain.Result;
+import com.dite.znpt.domain.entity.BusinessDataFileEntity;
+import com.dite.znpt.domain.page.PageBean;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@ApiOperation("商务资料文件service")
+@Service
+public interface BusinessDataFileService {
+
+ PageBean pageSelect(Integer page, Integer pageSize, Long folderId, String fileName);
+
+ Result delete(@RequestParam(value = "fileId", required = false) Long fileId,@RequestParam(value = "foldelId", required = false) Long folderId);
+
+ void add(BusinessDataFileEntity businessDataFileEntity);
+
+ String getPath(Long fileId);
+
+ // 在接口中添加重命名方法
+ Result reName(Long fileId, String newFileName);
+
+ // 在接口中添加预览方法
+// Result preview(Long fileId, HttpServletResponse response);
+}
diff --git a/core/src/main/java/com/dite/znpt/service/BusinessDataService.java b/core/src/main/java/com/dite/znpt/service/BusinessDataService.java
new file mode 100644
index 0000000..ec37987
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/BusinessDataService.java
@@ -0,0 +1,15 @@
+package com.dite.znpt.service;
+
+import com.dite.znpt.domain.Result;
+import com.dite.znpt.domain.page.PageBean;
+import io.swagger.annotations.ApiOperation;
+
+@ApiOperation("商务资料文件夹service")
+public interface BusinessDataService {
+
+ PageBean pageSelect(Integer page, Integer pageSize, String folderName);
+ Result createFolder(String folderName, Long parentId);
+ String getPath(Long parentId);
+ Result delete(Long folderId);
+ Result reName(Long folderId, String newName);
+}
diff --git a/core/src/main/java/com/dite/znpt/service/EmailService.java b/core/src/main/java/com/dite/znpt/service/EmailService.java
new file mode 100644
index 0000000..51a05f0
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/EmailService.java
@@ -0,0 +1,30 @@
+//package com.dite.znpt.service;
+//
+//import org.springframework.stereotype.Service;
+//
+//@Service
+//public interface EmailService {
+// /**
+// * 发送邮箱验证码
+// * @param email
+// * @param code
+// * @return
+// */
+// public boolean sendVerificationCode(String email, String code);
+//
+// /**
+// * 生成验证码
+// * @param email
+// * @return
+// */
+// public String generateCode(String email);
+//
+// /**
+// * 验证邮箱验证码
+// * @param email
+// * @param code
+// * @return
+// */
+// public boolean verifyCode(String email, String code);
+//
+//}
diff --git a/core/src/main/java/com/dite/znpt/service/EquipmentService.java b/core/src/main/java/com/dite/znpt/service/EquipmentService.java
index 5c21c21..c5a6c58 100644
--- a/core/src/main/java/com/dite/znpt/service/EquipmentService.java
+++ b/core/src/main/java/com/dite/znpt/service/EquipmentService.java
@@ -1,24 +1,74 @@
package com.dite.znpt.service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dite.znpt.domain.entity.EquipmentEntity;
import com.dite.znpt.domain.vo.EquipmentListReq;
import com.dite.znpt.domain.vo.EquipmentReq;
import com.dite.znpt.domain.vo.EquipmentResp;
-import com.dite.znpt.domain.vo.EquipmentUseRecordReq;
import java.util.List;
/**
+ * 设备服务接口
* @author Bear.G
* @date 2025/7/23/周三 17:39
* @description
*/
public interface EquipmentService extends IService {
- List page(EquipmentListReq req);
- List list(EquipmentListReq req);
+
+ /**
+ * 分页查询设备信息
+ */
+ IPage page(EquipmentListReq req);
+
+ /**
+ * 查询设备详情
+ */
EquipmentResp detail(String equipmentId);
+
+ /**
+ * 新增设备
+ */
void save(EquipmentReq req);
+
+ /**
+ * 修改设备
+ */
void update(String equipmentId, EquipmentReq req);
+
+ /**
+ * 删除设备
+ */
void deleteById(String equipmentId);
+
+ /**
+ * 批量删除设备
+ */
+ void batchDelete(List equipmentIds);
+
+ /**
+ * 获取采购统计信息
+ */
+ Object getProcurementStats();
+
+ /**
+ * 导出采购记录
+ */
+ byte[] exportProcurement(EquipmentListReq req);
+
+ /**
+ * 分页查询设备采购记录
+ */
+ IPage procurementPage(EquipmentListReq req);
+
+ /**
+ * 新增设备采购记录
+ */
+ void saveProcurement(EquipmentReq req);
+
+ /**
+ * 修改设备采购记录
+ */
+ void updateProcurement(String equipmentId, EquipmentReq req);
}
diff --git a/core/src/main/java/com/dite/znpt/service/ProjectBudgetInfoService.java b/core/src/main/java/com/dite/znpt/service/ProjectBudgetInfoService.java
index 72aa0f0..dd8c56a 100644
--- a/core/src/main/java/com/dite/znpt/service/ProjectBudgetInfoService.java
+++ b/core/src/main/java/com/dite/znpt/service/ProjectBudgetInfoService.java
@@ -2,10 +2,11 @@ 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.ProjectBudgetInfoDetailResp;
+import com.dite.znpt.domain.vo.ProjectBudgetInfoImportReq;
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 org.springframework.web.multipart.MultipartFile;
import java.util.List;
@@ -15,34 +16,16 @@ import java.util.List;
* @Description: 项目预算信息表服务接口
*/
public interface ProjectBudgetInfoService extends IService {
+ List list(ProjectBudgetInfoListReq projectBudgetInfoListReq);
- /**
- * 功能描述:查询项目预算信息列表
- *
- * @param projectBudgetInfoReq 项目预算信息
- * @return {@link List }<{@link ProjectBudgetInfoListResp }>
- * @author huise23
- * @date 2025/07/17 21:58
- **/
- List selectList(ProjectBudgetInfoListReq projectBudgetInfoReq);
+ List page(ProjectBudgetInfoListReq projectBudgetInfoListReq);
- /**
- * 功能描述:根据项目id获取项目预算信息列表
- *
- * @param projectId 项目id
- * @return {@link List }<{@link ProjectBudgetInfoListResp }>
- * @author huise23
- * @date 2025/07/17 21:58
- **/
- List detailByProjectId(String projectId);
+ void saveData(ProjectBudgetInfoImportReq req);
- /**
- * 功能描述:新增项目预算信息
- *
- * @param projectBudgetInfoReq 项目预算信息
- * @author huise23
- * @date 2025/07/17 21:58
- **/
- void saveData(List projectBudgetInfoReq);
+ void saveData(ProjectBudgetInfoImportReq req, MultipartFile[] files);
+
+ ProjectBudgetInfoDetailResp detailByProjectId(String projectId);
+
+ void delete(String budgetId);
}
diff --git a/core/src/main/java/com/dite/znpt/service/UserPostService.java b/core/src/main/java/com/dite/znpt/service/UserPostService.java
index bc14fd1..1060aff 100644
--- a/core/src/main/java/com/dite/znpt/service/UserPostService.java
+++ b/core/src/main/java/com/dite/znpt/service/UserPostService.java
@@ -1,9 +1,9 @@
package com.dite.znpt.service;
import com.baomidou.mybatisplus.extension.service.IService;
-import com.dite.znpt.domain.entity.PostEntity;
import com.dite.znpt.domain.entity.UserPostEntity;
import com.dite.znpt.domain.vo.PostResp;
+import com.dite.znpt.domain.vo.UserResp;
import java.util.List;
@@ -16,4 +16,5 @@ public interface UserPostService extends IService {
List getPostsByUserId(String userId);
void bindUserPost(String userId, List postIds);
void bindPostUser(String postId, List userIds);
+ List getUsersByPostId(String postId);
}
diff --git a/core/src/main/java/com/dite/znpt/service/UserRoleService.java b/core/src/main/java/com/dite/znpt/service/UserRoleService.java
index f4e508d..8527e4d 100644
--- a/core/src/main/java/com/dite/znpt/service/UserRoleService.java
+++ b/core/src/main/java/com/dite/znpt/service/UserRoleService.java
@@ -3,6 +3,7 @@ package com.dite.znpt.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dite.znpt.domain.entity.UserRoleEntity;
import com.dite.znpt.domain.vo.RoleResp;
+import com.dite.znpt.domain.vo.UserResp;
import com.dite.znpt.domain.vo.UserRoleReq;
import java.util.List;
@@ -19,4 +20,6 @@ public interface UserRoleService extends IService {
void bindUserRole(UserRoleReq req);
void bindRoleUser(String roleId, List userIds);
+
+ List getUsersByRoleId(String roleId);
}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java
new file mode 100644
index 0000000..2392b49
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java
@@ -0,0 +1,163 @@
+package com.dite.znpt.service.impl;
+
+
+
+import com.dite.znpt.domain.Result;
+import com.dite.znpt.domain.entity.BusinessDataFileEntity;
+import com.dite.znpt.domain.page.PageBean;
+import com.dite.znpt.mapper.BusinessDataFileMapper;
+import com.dite.znpt.service.BusinessDataFileService;
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import static jodd.io.FileUtil.deleteFile;
+import static org.apache.tomcat.util.http.fileupload.FileUtils.deleteDirectory;
+
+@AllArgsConstructor
+@Service
+@ApiOperation("商务资料文件service实现类")
+public class BusinessDataFileServiceImpl implements BusinessDataFileService {
+ @Resource
+ private BusinessDataFileMapper businessDataFileMapper;
+
+
+ @ApiOperation("分页查询文件")
+ @Override
+ public PageBean pageSelect(Integer page, Integer pageSize, Long folderId, String fileName) {
+ PageHelper.startPage(page, pageSize);
+ List list = businessDataFileMapper.List(folderId, fileName);
+ Page p = (Page) list;
+ PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
+ return pageBean;
+ }
+ @ApiOperation("删除文件")
+ public Result delete(Long fileId, Long folderId) {
+ //删除数据库数据
+ if (folderId != null){
+ businessDataFileMapper.delete(null,folderId);
+ System.out.println("888888888走对了");
+
+ return Result.okM("删除,走对了,成功");
+ }
+
+ //删除文件
+ String sPath = businessDataFileMapper.getPath(fileId);
+
+ businessDataFileMapper.delete(fileId,null);
+
+ boolean flag = false;
+ File file = new File(sPath);
+ // 判断目录或文件是否存在
+ if (!file.exists()) { // 不存在返回 false
+ return Result.error("文件不存在");
+ } else {
+ // 判断是否为文件
+ if (file.isFile()) { // 为文件时调用删除文件方法
+ try {
+ deleteFile(file);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return Result.okM("删除成功");
+ } else { // 为目录时调用删除目录方法
+ try {
+ deleteDirectory(file);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return Result.okM("删除成功");
+ }
+ }
+
+
+ }
+
+ @ApiOperation("增加文件")
+ public void add(BusinessDataFileEntity businessDataFileEntity) {
+ businessDataFileMapper.add(businessDataFileEntity);
+ }
+
+ @ApiOperation("获取文件路径")
+ public String getPath(Long fileId) {
+ return businessDataFileMapper.getPath(fileId);
+ }
+
+ @ApiOperation("重命名文件")
+ @Override
+ public Result reName(Long fileId, String newFileName) {
+ // 参数校验
+ if (fileId == null) {
+ return Result.error("文件ID不能为空");
+ }
+ if (newFileName == null || newFileName.trim().isEmpty()) {
+ return Result.error("新文件名不能为空");
+ }
+ if (newFileName.length() > 100) {
+ return Result.error("文件名过长");
+ }
+
+ try {
+ // 获取原文件信息
+ String oldFilePath = businessDataFileMapper.getPath(fileId);
+ if (oldFilePath == null) {
+ return Result.error("文件不存在");
+ }
+
+ // 创建原文件对象
+ File oldFile = new File(oldFilePath);
+ if (!oldFile.exists()) {
+ return Result.error("文件不存在");
+ }
+
+ // 构建新文件路径
+ String parentPath = oldFile.getParent();
+ String fileExtension = "";
+ String fileNameWithoutExt = newFileName;
+
+ // 获取原文件扩展名
+ int lastDotIndex = oldFile.getName().lastIndexOf('.');
+ if (lastDotIndex > 0) {
+ fileExtension = oldFile.getName().substring(lastDotIndex);
+ }
+
+ // 如果新文件名没有扩展名,则添加原文件扩展名
+ if (!newFileName.contains(".")) {
+ newFileName = newFileName + fileExtension;
+ }
+
+ // 构建新文件路径
+ String newFilePath = parentPath + File.separator + newFileName;
+ File newFile = new File(newFilePath);
+
+ // 检查新文件名是否已存在
+ if (newFile.exists()) {
+ return Result.error("文件名已存在");
+ }
+
+ // 重命名实际文件
+ boolean renameSuccess = oldFile.renameTo(newFile);
+ if (!renameSuccess) {
+ return Result.error("文件重命名失败");
+ }
+
+ // 更新数据库中的文件信息
+ businessDataFileMapper.reName(fileId, newFileName, newFilePath);
+
+ return Result.okM("文件重命名成功");
+
+ } catch (Exception e) {
+ return Result.error("文件重命名失败: " + e.getMessage());
+ }
+ }
+
+
+
+}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataServiceImpl.java
new file mode 100644
index 0000000..3d74793
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataServiceImpl.java
@@ -0,0 +1,197 @@
+package com.dite.znpt.service.impl;
+
+import com.dite.znpt.domain.Result;
+import com.dite.znpt.domain.entity.BusinessDataEntity;
+import com.dite.znpt.domain.page.PageBean;
+import com.dite.znpt.mapper.BusinessDataMapper;
+import com.dite.znpt.service.BusinessDataFileService;
+import com.dite.znpt.service.BusinessDataService;
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.time.LocalDateTime;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * 商务资料文件夹实现类
+ */
+@Service
+@ApiOperation("商务资料文件夹service实现类")
+@AllArgsConstructor
+@NoArgsConstructor
+public class BusinessDataServiceImpl implements BusinessDataService {
+ @Resource
+ private BusinessDataMapper businessDataMapper;
+ @Resource
+ private BusinessDataFileService businessDataFileService;
+
+ // 从配置文件中读取基础路径(默认值:D:/upload/businessData)
+ // ,新建文件夹的时候,如果没指定父文件夹Id,就用这个
+ @Value("${file.upload.businessDataPath:D:/upload/businessData}")
+ private String businessDataPath;
+
+ @ApiOperation(value = "分页查询")
+ @Override
+ public PageBean pageSelect(Integer page, Integer pageSize, String folderName) {
+ PageHelper.startPage(page, pageSize);
+ List businessDataEntityList = businessDataMapper.ListWithCondition(folderName);
+ Page p = (Page) businessDataEntityList;
+ PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
+ return pageBean;
+ }
+
+ @ApiOperation(value = "创建文件夹")
+ @Override
+ public Result createFolder(String folderName, Long parentId) {
+ //获取ID
+ Long loginIdAsLong = 888L;
+// loginIdAsLong = StpUtil.getLoginIdAsLong();
+//
+ // 文件夹名称不能为空
+ //TODO: 添加文件夹名称校验,后续最好更规范些,写个工具类专门校验,用正则表达式
+ if (folderName == null || folderName.trim().isEmpty()) {
+ return Result.error("文件夹名称不能为空");
+ }
+ if (folderName.length() > 50) {
+ return Result.error("文件夹名称过长");
+ }
+
+ // 文件夹名称前置一个/
+ String folderName1 = "/" + folderName;
+ // 目标文件夹
+ File targetDir=Paths.get(businessDataPath, folderName1).toFile();
+ if(parentId != 0L){
+ // 获取父文件夹路径
+ targetDir = Paths.get(businessDataMapper.getPath(parentId), folderName1).toFile();
+ }
+ // 创建文件夹和新增文件夹路径
+ if (!targetDir.exists()) {
+ // 创建文件夹
+ boolean created = targetDir.mkdirs();
+ if (!created) {
+ throw new RuntimeException("文件夹创建失败: " + targetDir.getAbsolutePath());
+ }
+ //上面是新增文件夹功能,但没有往数据库插入文件夹相关数据,所以下面新增
+ // 创建BusinessDataEntity对象并设置属性
+ BusinessDataEntity businessDataEntity = new BusinessDataEntity(
+ null,
+ folderName,
+ parentId,
+ loginIdAsLong,
+ LocalDateTime.now(),
+ LocalDateTime.now(),
+ false,
+ targetDir.getAbsolutePath()
+ );
+ // 插入到数据库
+ businessDataMapper.insert(businessDataEntity);
+ return Result.okM( "文件夹创建成功");
+ } else {
+ return Result.error("文件夹已存在: ");
+ }
+ }
+
+ @ApiOperation("获取文件夹路径")
+ public String getPath(Long parentId) {
+ return businessDataMapper.getPath(parentId);
+ }
+
+// @ApiOperation("删除文件夹")
+// @Override
+// public Result delete(Long folderId) {
+// // 获取文件夹路径
+// String folderPath = businessDataMapper.getPath(folderId);
+//
+// // 创建File对象并删除文件夹
+// File folder = new File(folderPath);
+// if (folder.exists()) {
+// boolean deleted = folder.delete();
+// if (!deleted) {
+// // throw new RuntimeException("文件夹删除失败: " + folderPath);
+// // TODO: 以后可以用全局异常处理器捕获,或者用try catch捕获
+// return Result.error("文件夹删除失败: " + folderPath);
+// }
+// //删除数据库中文件夹的数据
+// businessDataMapper.delete(folderId);
+// //删除文件夹下文件的数据
+// businessDataFileService.delete(folderId);
+// return Result.okM("删除成功");
+// } else {
+// // throw new RuntimeException("文件夹不存在: " + folderPath);
+// return Result.error("文件夹不存在: " + folderPath);
+// }
+// }
+ @ApiOperation("删除文件夹")
+ @Override
+ public Result delete(Long folderId) {
+ // 获取文件夹路径
+ String folderPath = businessDataMapper.getPath(folderId);
+
+ // 创建Path对象并删除文件夹
+ Path folder = Paths.get(folderPath);
+ if (Files.exists(folder)) {
+ try {
+ // 使用Files.walk获取所有文件和目录,按深度排序后删除
+ java.util.stream.Stream filePaths = Files.walk(folder);
+ filePaths.sorted(Comparator.reverseOrder())
+ .map(Path::toFile)
+ .forEach(File::delete);
+ filePaths.close();
+
+ //删除数据库中文件夹的数据
+ businessDataMapper.delete(folderId);
+ //删除文件夹下文件的数据
+ businessDataFileService.delete(null , folderId);
+ return Result.okM("删除成功");
+ } catch (Exception e) {
+ return Result.okM("删除成功");
+ }
+ } else {
+ return Result.error("文件夹不存在: " + folderPath);
+ }
+ }
+ @ApiOperation("重命名文件夹")
+ @Override
+ public Result reName(Long folderId, String newName) {
+ // 获取文件夹路径
+ String folderPath = businessDataMapper.getPath(folderId);
+ String newPath = folderPath.substring(0, folderPath.lastIndexOf('\\'))+"\\" + newName;
+ System.out.printf("7777777"+newPath);
+//
+// //想命名的原文件的路径
+// File file = new File("f:/a/a.xlsx");
+// //将原文件更改为f:\a\b.xlsx,其中路径是必要的。注意
+// file.renameTo(new File("f:/a/b.xlsx"));
+ //想命名的原文件夹的路径
+ File file1 = new File(folderPath);
+ //将原文件夹更改为A,其中路径是必要的。注意
+ file1.renameTo(new File(newPath));
+ LocalDateTime now = LocalDateTime.now();
+
+ BusinessDataEntity businessDataEntity = new BusinessDataEntity(
+ folderId,
+ newName,
+ null,
+ null,
+ null,
+ now,
+ null,
+ newPath
+ );
+ System.out.println(businessDataEntity);
+ businessDataMapper.reName(businessDataEntity);
+ return Result.okM("重命名成功");
+ }
+
+}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/ContractServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ContractServiceImpl.java
index 2f830c9..8794210 100644
--- a/core/src/main/java/com/dite/znpt/service/impl/ContractServiceImpl.java
+++ b/core/src/main/java/com/dite/znpt/service/impl/ContractServiceImpl.java
@@ -1,17 +1,18 @@
package com.dite.znpt.service.impl;
import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dite.znpt.domain.entity.ContractEntity;
import com.dite.znpt.domain.vo.ContractListReq;
-import com.dite.znpt.domain.vo.ContractResp;
import com.dite.znpt.domain.vo.ContractReq;
-import com.dite.znpt.service.ContractService;
+import com.dite.znpt.domain.vo.ContractResp;
+import com.dite.znpt.enums.ContractStatusEnum;
import com.dite.znpt.mapper.ContractMapper;
-import org.springframework.stereotype.Service;
-import cn.hutool.core.collection.CollUtil;
-import lombok.RequiredArgsConstructor;
+import com.dite.znpt.service.ContractService;
import com.dite.znpt.util.PageUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
import java.util.List;
@@ -37,7 +38,7 @@ public class ContractServiceImpl extends ServiceImpl contractList= this.baseMapper.queryBySelective(contractReq);
contractList.forEach(resp -> {
-
+ resp.setContractStatusLabel(ContractStatusEnum.getDescByCode(resp.getContractStatus()));
});
return contractList;
}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/EmailServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/EmailServiceImpl.java
new file mode 100644
index 0000000..42c9ed7
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/impl/EmailServiceImpl.java
@@ -0,0 +1,66 @@
+//package com.dite.znpt.service.impl;
+//
+//import com.dite.znpt.service.EmailService;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.http.HttpStatus;
+//import org.springframework.mail.SimpleMailMessage;
+//import org.springframework.mail.javamail.JavaMailSender;
+//import org.springframework.stereotype.Service;
+//import org.springframework.web.server.ResponseStatusException;
+//
+//import java.util.Random;
+//
+//@Slf4j
+//@Service
+//public class EmailServiceImpl implements EmailService {
+//
+// @Autowired
+// private JavaMailSender mailSender;
+//
+// @Autowired
+// private InMemoryVerificationCodeStore codeStore;
+//
+// @Value("${email.verification.from}")
+// private String from;
+// @Value("${email.verification.subject}")
+// private String subject;
+// @Value("${email.verification.template}")
+// private String template;
+//
+// @Override
+// public boolean sendVerificationCode(String email, String code) {
+// SimpleMailMessage message = new SimpleMailMessage();
+// message.setFrom(from);
+// message.setSubject(subject);
+// message.setTo(email);
+// message.setText(String.format(template,code));
+// try{
+// mailSender.send(message);
+// return true;
+// }catch (Exception e){
+// log.error("发送邮件失败:",e);
+// return false;
+// }
+// }
+//
+// @Override
+// public String generateCode(String email) {
+// if (!codeStore.canSend(email)) {
+// throw new ResponseStatusException(
+// HttpStatus.TOO_MANY_REQUESTS, // 429 状态码
+// "验证码发送过于频繁,请稍后再试"
+// );
+// }
+//
+// String code = String.format("%04d", new Random().nextInt(9999));
+// codeStore.save(email, code);
+// return code;
+// }
+//
+// @Override
+// public boolean verifyCode(String email, String code) {
+// return codeStore.validate(email, code);
+// }
+//}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java
index 8b6b013..8f15c6e 100644
--- a/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java
+++ b/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java
@@ -1,97 +1,418 @@
package com.dite.znpt.service.impl;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dite.znpt.constant.Message;
-import com.dite.znpt.converts.Converts;
import com.dite.znpt.domain.entity.EquipmentEntity;
-import com.dite.znpt.domain.entity.EquipmentUseRecordEntity;
import com.dite.znpt.domain.vo.EquipmentListReq;
import com.dite.znpt.domain.vo.EquipmentReq;
import com.dite.znpt.domain.vo.EquipmentResp;
-import com.dite.znpt.domain.vo.EquipmentUseRecordReq;
import com.dite.znpt.enums.EquipmentStatusEnum;
import com.dite.znpt.enums.EquipmentTypeEnum;
+import com.dite.znpt.enums.HealthStatusEnum;
+import com.dite.znpt.enums.LocationStatusEnum;
import com.dite.znpt.exception.ServiceException;
import com.dite.znpt.mapper.EquipmentMapper;
import com.dite.znpt.service.EquipmentService;
-import com.dite.znpt.service.EquipmentUseRecordService;
-import com.dite.znpt.service.ProjectService;
-import com.dite.znpt.service.UserService;
-import com.dite.znpt.util.PageUtil;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
-import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
+import java.util.stream.Collectors;
/**
* @author Bear.G
* @date 2025/7/23/周三 17:39
* @description
*/
+@Slf4j
@Service
public class EquipmentServiceImpl extends ServiceImpl implements EquipmentService {
- @Resource
- private EquipmentUseRecordService equipmentUseRecordService;
-
- @Resource
- private UserService userService;
-
- @Resource
- private ProjectService projectService;
-
@Override
- public List page(EquipmentListReq req) {
- PageUtil.startPage();
- return this.list(req);
- }
-
- @Override
- public List list(EquipmentListReq req) {
- List list = this.baseMapper.selectEquipmentResp(req);
- list.forEach(resp -> {
- resp.setEquipmentTypeLabel(EquipmentTypeEnum.getDescByCode(resp.getEquipmentType()));
- resp.setEquipmentStatusLabel(EquipmentStatusEnum.getDescByCode(resp.getEquipmentStatus()));
- });
- return list;
+ public IPage page(EquipmentListReq req) {
+ log.info("开始执行设备分页查询,请求参数: {}", req);
+
+ // 创建分页对象,处理null值
+ Integer pageNum = req.getPage() != null ? req.getPage() : (req.getPageNum() != null ? req.getPageNum() : 1);
+ Integer pageSize = req.getPageSize() != null ? req.getPageSize() : 10;
+ Page page = new Page<>(pageNum, pageSize);
+
+ // 构建查询条件
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ // 不需要手动添加 del_flag 条件,@TableLogic 注解会自动处理
+
+ // 添加搜索条件并记录日志
+ int conditionCount = 0;
+
+ if (StringUtils.hasText(req.getEquipmentName())) {
+ queryWrapper.like(EquipmentEntity::getEquipmentName, req.getEquipmentName());
+ log.info("添加设备名称查询条件: {}", req.getEquipmentName());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getEquipmentType())) {
+ queryWrapper.eq(EquipmentEntity::getEquipmentType, req.getEquipmentType());
+ log.info("添加设备类型查询条件: {}", req.getEquipmentType());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getEquipmentStatus())) {
+ queryWrapper.eq(EquipmentEntity::getEquipmentStatus, req.getEquipmentStatus());
+ log.info("添加设备状态查询条件: {}", req.getEquipmentStatus());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getEquipmentSn())) {
+ queryWrapper.like(EquipmentEntity::getEquipmentSn, req.getEquipmentSn());
+ log.info("添加设备序列号查询条件: {}", req.getEquipmentSn());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getAssetCode())) {
+ queryWrapper.like(EquipmentEntity::getAssetCode, req.getAssetCode());
+ log.info("添加资产编号查询条件: {}", req.getAssetCode());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getBrand())) {
+ queryWrapper.like(EquipmentEntity::getBrand, req.getBrand());
+ log.info("添加品牌查询条件: {}", req.getBrand());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getLocationStatus())) {
+ queryWrapper.eq(EquipmentEntity::getLocationStatus, req.getLocationStatus());
+ log.info("添加位置状态查询条件: {}", req.getLocationStatus());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getHealthStatus())) {
+ queryWrapper.eq(EquipmentEntity::getHealthStatus, req.getHealthStatus());
+ log.info("添加健康状态查询条件: {}", req.getHealthStatus());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getResponsiblePerson())) {
+ queryWrapper.like(EquipmentEntity::getResponsiblePerson, req.getResponsiblePerson());
+ log.info("添加负责人查询条件: {}", req.getResponsiblePerson());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getUseStatus())) {
+ queryWrapper.eq(EquipmentEntity::getUseStatus, req.getUseStatus());
+ log.info("添加使用状态查询条件: {}", req.getUseStatus());
+ conditionCount++;
+ }
+
+ // 新增查询条件
+ if (StringUtils.hasText(req.getEquipmentModel())) {
+ queryWrapper.like(EquipmentEntity::getEquipmentModel, req.getEquipmentModel());
+ log.info("添加设备型号查询条件: {}", req.getEquipmentModel());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getSpecification())) {
+ queryWrapper.like(EquipmentEntity::getSpecification, req.getSpecification());
+ log.info("添加配置规格查询条件: {}", req.getSpecification());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getPhysicalLocation())) {
+ queryWrapper.like(EquipmentEntity::getPhysicalLocation, req.getPhysicalLocation());
+ log.info("添加物理位置查询条件: {}", req.getPhysicalLocation());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getSupplierName())) {
+ queryWrapper.like(EquipmentEntity::getSupplierName, req.getSupplierName());
+ log.info("添加供应商名称查询条件: {}", req.getSupplierName());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getMaintenancePerson())) {
+ queryWrapper.like(EquipmentEntity::getMaintenancePerson, req.getMaintenancePerson());
+ log.info("添加维护人员查询条件: {}", req.getMaintenancePerson());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getInventoryBarcode())) {
+ queryWrapper.like(EquipmentEntity::getInventoryBarcode, req.getInventoryBarcode());
+ log.info("添加库存条码查询条件: {}", req.getInventoryBarcode());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getAssetRemark())) {
+ queryWrapper.like(EquipmentEntity::getAssetRemark, req.getAssetRemark());
+ log.info("添加资产备注查询条件: {}", req.getAssetRemark());
+ conditionCount++;
+ }
+
+ // 新增字段查询条件
+ if (StringUtils.hasText(req.getUsingDepartment())) {
+ queryWrapper.like(EquipmentEntity::getUsingDepartment, req.getUsingDepartment());
+ log.info("添加使用部门/人查询条件: {}", req.getUsingDepartment());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getInvoice())) {
+ queryWrapper.like(EquipmentEntity::getInvoice, req.getInvoice());
+ log.info("添加发票查询条件: {}", req.getInvoice());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getBarcode())) {
+ queryWrapper.like(EquipmentEntity::getBarcode, req.getBarcode());
+ log.info("添加条码查询条件: {}", req.getBarcode());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getImporter())) {
+ queryWrapper.like(EquipmentEntity::getImporter, req.getImporter());
+ log.info("添加导入人查询条件: {}", req.getImporter());
+ conditionCount++;
+ }
+
+ // 新增采购相关字段查询条件
+ if (StringUtils.hasText(req.getAccountNumber())) {
+ queryWrapper.like(EquipmentEntity::getAccountNumber, req.getAccountNumber());
+ log.info("添加次户号查询条件: {}", req.getAccountNumber());
+ conditionCount++;
+ }
+ if (req.getQuantity() != null) {
+ queryWrapper.eq(EquipmentEntity::getQuantity, req.getQuantity());
+ log.info("添加数量查询条件: {}", req.getQuantity());
+ conditionCount++;
+ }
+ if (req.getUnitPrice() != null) {
+ queryWrapper.eq(EquipmentEntity::getUnitPrice, req.getUnitPrice());
+ log.info("添加单价查询条件: {}", req.getUnitPrice());
+ conditionCount++;
+ }
+ if (req.getTotalPrice() != null) {
+ queryWrapper.eq(EquipmentEntity::getTotalPrice, req.getTotalPrice());
+ log.info("添加总价查询条件: {}", req.getTotalPrice());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getInventoryBasis())) {
+ queryWrapper.like(EquipmentEntity::getInventoryBasis, req.getInventoryBasis());
+ log.info("添加盘点依据查询条件: {}", req.getInventoryBasis());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getDynamicRecord())) {
+ queryWrapper.like(EquipmentEntity::getDynamicRecord, req.getDynamicRecord());
+ log.info("添加动态记录查询条件: {}", req.getDynamicRecord());
+ conditionCount++;
+ }
+
+ // 时间范围查询
+ if (req.getPurchaseTimeStart() != null) {
+ queryWrapper.ge(EquipmentEntity::getPurchaseTime, req.getPurchaseTimeStart());
+ log.info("添加采购时间开始查询条件: {}", req.getPurchaseTimeStart());
+ conditionCount++;
+ }
+ if (req.getPurchaseTimeEnd() != null) {
+ queryWrapper.le(EquipmentEntity::getPurchaseTime, req.getPurchaseTimeEnd());
+ log.info("添加采购时间结束查询条件: {}", req.getPurchaseTimeEnd());
+ conditionCount++;
+ }
+ if (req.getInStockTimeStart() != null) {
+ queryWrapper.ge(EquipmentEntity::getInStockTime, req.getInStockTimeStart());
+ conditionCount++;
+ }
+ if (req.getInStockTimeEnd() != null) {
+ queryWrapper.le(EquipmentEntity::getInStockTime, req.getInStockTimeEnd());
+ conditionCount++;
+ }
+ if (req.getActivationTimeStart() != null) {
+ queryWrapper.ge(EquipmentEntity::getActivationTime, req.getActivationTimeStart());
+ conditionCount++;
+ }
+ if (req.getActivationTimeEnd() != null) {
+ queryWrapper.le(EquipmentEntity::getActivationTime, req.getActivationTimeEnd());
+ conditionCount++;
+ }
+ if (req.getExpectedScrapTimeStart() != null) {
+ queryWrapper.ge(EquipmentEntity::getExpectedScrapTime, req.getExpectedScrapTimeStart());
+ conditionCount++;
+ }
+ if (req.getExpectedScrapTimeEnd() != null) {
+ queryWrapper.le(EquipmentEntity::getExpectedScrapTime, req.getExpectedScrapTimeEnd());
+ conditionCount++;
+ }
+ if (req.getWarrantyExpireDateStart() != null) {
+ queryWrapper.ge(EquipmentEntity::getWarrantyExpireDate, req.getWarrantyExpireDateStart());
+ conditionCount++;
+ }
+ if (req.getWarrantyExpireDateEnd() != null) {
+ queryWrapper.le(EquipmentEntity::getWarrantyExpireDate, req.getWarrantyExpireDateEnd());
+ conditionCount++;
+ }
+ if (req.getLastMaintenanceDateStart() != null) {
+ queryWrapper.ge(EquipmentEntity::getLastMaintenanceDate, req.getLastMaintenanceDateStart());
+ conditionCount++;
+ }
+ if (req.getLastMaintenanceDateEnd() != null) {
+ queryWrapper.le(EquipmentEntity::getLastMaintenanceDate, req.getLastMaintenanceDateEnd());
+ conditionCount++;
+ }
+ if (req.getNextMaintenanceDateStart() != null) {
+ queryWrapper.ge(EquipmentEntity::getNextMaintenanceDate, req.getNextMaintenanceDateStart());
+ conditionCount++;
+ }
+ if (req.getNextMaintenanceDateEnd() != null) {
+ queryWrapper.le(EquipmentEntity::getNextMaintenanceDate, req.getNextMaintenanceDateEnd());
+ conditionCount++;
+ }
+ if (req.getCreateTimeStart() != null) {
+ queryWrapper.ge(EquipmentEntity::getCreateTime, req.getCreateTimeStart());
+ conditionCount++;
+ }
+ if (req.getCreateTimeEnd() != null) {
+ queryWrapper.le(EquipmentEntity::getCreateTime, req.getCreateTimeEnd());
+ conditionCount++;
+ }
+ if (req.getUpdateTimeStart() != null) {
+ queryWrapper.ge(EquipmentEntity::getUpdateTime, req.getUpdateTimeStart());
+ conditionCount++;
+ }
+ if (req.getUpdateTimeEnd() != null) {
+ queryWrapper.le(EquipmentEntity::getUpdateTime, req.getUpdateTimeEnd());
+ conditionCount++;
+ }
+
+ log.info("总共添加了 {} 个查询条件", conditionCount);
+
+ // 排序处理
+ if (StringUtils.hasText(req.getOrderBy())) {
+ String orderBy = req.getOrderBy();
+ String orderDirection = "desc".equalsIgnoreCase(req.getOrderDirection()) ? "desc" : "asc";
+
+ switch (orderBy.toLowerCase()) {
+ case "equipment_name":
+ if ("desc".equals(orderDirection)) {
+ queryWrapper.orderByDesc(EquipmentEntity::getEquipmentName);
+ } else {
+ queryWrapper.orderByAsc(EquipmentEntity::getEquipmentName);
+ }
+ break;
+ case "equipment_sn":
+ if ("desc".equals(orderDirection)) {
+ queryWrapper.orderByDesc(EquipmentEntity::getEquipmentSn);
+ } else {
+ queryWrapper.orderByAsc(EquipmentEntity::getEquipmentSn);
+ }
+ break;
+ case "asset_code":
+ if ("desc".equals(orderDirection)) {
+ queryWrapper.orderByDesc(EquipmentEntity::getAssetCode);
+ } else {
+ queryWrapper.orderByAsc(EquipmentEntity::getAssetCode);
+ }
+ break;
+ case "equipment_type":
+ if ("desc".equals(orderDirection)) {
+ queryWrapper.orderByDesc(EquipmentEntity::getEquipmentType);
+ } else {
+ queryWrapper.orderByAsc(EquipmentEntity::getEquipmentType);
+ }
+ break;
+ case "equipment_status":
+ if ("desc".equals(orderDirection)) {
+ queryWrapper.orderByDesc(EquipmentEntity::getEquipmentStatus);
+ } else {
+ queryWrapper.orderByAsc(EquipmentEntity::getEquipmentStatus);
+ }
+ break;
+ case "brand":
+ if ("desc".equals(orderDirection)) {
+ queryWrapper.orderByDesc(EquipmentEntity::getBrand);
+ } else {
+ queryWrapper.orderByAsc(EquipmentEntity::getBrand);
+ }
+ break;
+ case "responsible_person":
+ if ("desc".equals(orderDirection)) {
+ queryWrapper.orderByDesc(EquipmentEntity::getResponsiblePerson);
+ } else {
+ queryWrapper.orderByAsc(EquipmentEntity::getResponsiblePerson);
+ }
+ break;
+ case "purchase_time":
+ if ("desc".equals(orderDirection)) {
+ queryWrapper.orderByDesc(EquipmentEntity::getPurchaseTime);
+ } else {
+ queryWrapper.orderByAsc(EquipmentEntity::getPurchaseTime);
+ }
+ break;
+ case "purchase_price":
+ if ("desc".equals(orderDirection)) {
+ queryWrapper.orderByDesc(EquipmentEntity::getTotalPrice);
+ } else {
+ queryWrapper.orderByAsc(EquipmentEntity::getTotalPrice);
+ }
+ break;
+ case "update_time":
+ if ("desc".equals(orderDirection)) {
+ queryWrapper.orderByDesc(EquipmentEntity::getUpdateTime);
+ } else {
+ queryWrapper.orderByAsc(EquipmentEntity::getUpdateTime);
+ }
+ break;
+ default:
+ // 默认按创建时间倒序
+ queryWrapper.orderByDesc(EquipmentEntity::getCreateTime);
+ break;
+ }
+ log.info("添加排序条件: {} {}", orderBy, orderDirection);
+ } else {
+ // 默认按创建时间倒序
+ queryWrapper.orderByDesc(EquipmentEntity::getCreateTime);
+ log.info("使用默认排序: 按创建时间倒序");
+ }
+
+ log.info("执行分页查询,SQL条件: {}", queryWrapper.getTargetSql());
+
+ // 执行分页查询
+ IPage equipmentPage = this.page(page, queryWrapper);
+
+ log.info("查询完成,总记录数: {}, 当前页记录数: {}", equipmentPage.getTotal(), equipmentPage.getRecords().size());
+
+ // 转换为响应对象
+ List equipmentRespList = equipmentPage.getRecords().stream()
+ .map(this::convertToResp)
+ .collect(Collectors.toList());
+
+ // 创建响应分页对象
+ Page respPage = new Page<>(equipmentPage.getCurrent(), equipmentPage.getSize(), equipmentPage.getTotal());
+ respPage.setRecords(equipmentRespList);
+
+ return respPage;
}
@Override
public EquipmentResp detail(String equipmentId) {
- EquipmentResp resp = this.baseMapper.getEquipmentRespByEquipmentId(equipmentId);
- resp.setEquipmentTypeLabel(EquipmentTypeEnum.getDescByCode(resp.getEquipmentType()));
- resp.setEquipmentStatusLabel(EquipmentStatusEnum.getDescByCode(resp.getEquipmentStatus()));
- return resp;
+ EquipmentEntity equipment = this.getById(equipmentId);
+ if (equipment == null) {
+ throw new ServiceException(Message.EQUIPMENT_ID_NOT_EXIST);
+ }
+ return convertToResp(equipment);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void save(EquipmentReq req) {
- EquipmentEntity entity = Converts.INSTANCE.toEquipmentUseRecordEntity(req);
- if(null != getByEquipmentSn(entity.getEquipmentSn())){
+ EquipmentEntity entity = convertToEntity(req);
+ if (getByEquipmentSn(entity.getEquipmentSn()) != null) {
throw new ServiceException(Message.EQUIPMENT_SN_EXIST);
}
this.save(entity);
}
- private EquipmentEntity getByEquipmentSn(String equipmentSn){
- return this.getOne(Wrappers.lambdaQuery(EquipmentEntity.class).eq(EquipmentEntity::getEquipmentSn, equipmentSn));
+ private EquipmentEntity getByEquipmentSn(String equipmentSn) {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(EquipmentEntity::getEquipmentSn, equipmentSn);
+ return this.getOne(queryWrapper);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void update(String equipmentId, EquipmentReq req) {
EquipmentEntity equipment = this.getById(equipmentId);
- if(null == equipment){
+ if (equipment == null) {
throw new ServiceException(Message.EQUIPMENT_ID_NOT_EXIST);
}
- if(!equipment.getEquipmentSn().equals(req.getEquipmentSn()) && null != getByEquipmentSn(req.getEquipmentSn())){
+ if (!equipment.getEquipmentSn().equals(req.getEquipmentSn()) && getByEquipmentSn(req.getEquipmentSn()) != null) {
throw new ServiceException(Message.EQUIPMENT_SN_EXIST);
}
- EquipmentEntity entity = Converts.INSTANCE.toEquipmentUseRecordEntity(req);
+ EquipmentEntity entity = convertToEntity(req);
entity.setEquipmentId(equipmentId);
this.updateById(entity);
}
@@ -100,9 +421,393 @@ public class EquipmentServiceImpl extends ServiceImpl equipmentIds) {
+ if (equipmentIds == null || equipmentIds.isEmpty()) {
+ throw new ServiceException("设备ID列表不能为空");
+ }
+ this.removeByIds(equipmentIds);
+ }
+
+ @Override
+ public byte[] exportProcurement(EquipmentListReq req) {
+ // 这里可以实现导出功能,返回Excel文件的字节数组
+ // 暂时返回空数组,实际项目中需要实现具体的导出逻辑
+ return new byte[0];
+ }
+
+ /**
+ * 将EquipmentReq转换为EquipmentEntity
+ */
+ private EquipmentEntity convertToEntity(EquipmentReq req) {
+ EquipmentEntity entity = new EquipmentEntity();
+ entity.setAssetCode(req.getAssetCode());
+ entity.setEquipmentName(req.getEquipmentName());
+ entity.setEquipmentModel(req.getEquipmentModel());
+ entity.setEquipmentType(req.getEquipmentType());
+ entity.setEquipmentStatus(req.getEquipmentStatus());
+ entity.setUseStatus(req.getUseStatus());
+ entity.setEquipmentSn(req.getEquipmentSn());
+ entity.setBrand(req.getBrand());
+ entity.setSpecification(req.getSpecification());
+ entity.setLocationStatus(req.getLocationStatus());
+ entity.setPhysicalLocation(req.getPhysicalLocation());
+ entity.setResponsiblePerson(req.getResponsiblePerson());
+ entity.setHealthStatus(req.getHealthStatus());
+ entity.setPurchaseTime(req.getPurchaseTime());
+ entity.setInStockTime(req.getInStockTime());
+ entity.setActivationTime(req.getActivationTime());
+ entity.setExpectedScrapTime(req.getExpectedScrapTime());
+ entity.setActualScrapTime(req.getActualScrapTime());
+ entity.setStatusChangeTime(req.getStatusChangeTime());
+ entity.setPurchaseOrder(req.getPurchaseOrder());
+ entity.setSupplierName(req.getSupplierName());
+ entity.setCurrentNetValue(req.getCurrentNetValue());
+ entity.setDepreciationMethod(req.getDepreciationMethod());
+ entity.setDepreciationYears(req.getDepreciationYears());
+ entity.setSalvageValue(req.getSalvageValue());
+ entity.setWarrantyExpireDate(req.getWarrantyExpireDate());
+ entity.setLastMaintenanceDate(req.getLastMaintenanceDate());
+ entity.setNextMaintenanceDate(req.getNextMaintenanceDate());
+ entity.setMaintenancePerson(req.getMaintenancePerson());
+ entity.setInventoryBarcode(req.getInventoryBarcode());
+ entity.setAssetRemark(req.getAssetRemark());
+
+ // 新增采购相关字段
+ entity.setAccountNumber(req.getAccountNumber());
+ entity.setQuantity(req.getQuantity());
+ entity.setUnitPrice(req.getUnitPrice());
+ entity.setTotalPrice(req.getTotalPrice());
+ entity.setInventoryBasis(req.getInventoryBasis());
+ entity.setDynamicRecord(req.getDynamicRecord());
+
+ // 新增字段转换
+ entity.setUsingDepartment(req.getUsingDepartment());
+ entity.setBorrowingTime(req.getBorrowingTime());
+ entity.setReturnTime(req.getReturnTime());
+ entity.setOutStockTime(req.getOutStockTime());
+ entity.setTotalUsageTime(req.getTotalUsageTime());
+ entity.setDepreciationRate(req.getDepreciationRate());
+ entity.setDepreciationMethodDesc(req.getDepreciationMethodDesc());
+ entity.setInvoice(req.getInvoice());
+ entity.setInvoiceStatus(req.getInvoiceStatus());
+ entity.setAttachments(req.getAttachments());
+ entity.setPhotos(req.getPhotos());
+ entity.setBarcode(req.getBarcode());
+ entity.setImporter(req.getImporter());
+ entity.setInventoryTimeStatus1(req.getInventoryTimeStatus1());
+ entity.setInventoryTimeStatus2(req.getInventoryTimeStatus2());
+ entity.setInventoryTimeStatus3(req.getInventoryTimeStatus3());
+ entity.setInventoryCheckTimeStatus1(req.getInventoryCheckTimeStatus1());
+ entity.setInventoryCheckTimeStatus2(req.getInventoryCheckTimeStatus2());
+ entity.setInventoryCheckTimeStatus3(req.getInventoryCheckTimeStatus3());
+
+ return entity;
+ }
+
+ /**
+ * 转换为响应对象
+ */
+ private EquipmentResp convertToResp(EquipmentEntity entity) {
+ EquipmentResp resp = new EquipmentResp();
+ resp.setEquipmentId(entity.getEquipmentId());
+ resp.setAssetCode(entity.getAssetCode());
+ resp.setEquipmentName(entity.getEquipmentName());
+ resp.setEquipmentType(entity.getEquipmentType());
+ resp.setEquipmentTypeLabel(EquipmentTypeEnum.getDescByCode(entity.getEquipmentType()));
+ resp.setEquipmentModel(entity.getEquipmentModel());
+ resp.setEquipmentSn(entity.getEquipmentSn());
+ resp.setBrand(entity.getBrand());
+ resp.setSpecification(entity.getSpecification());
+ resp.setEquipmentStatus(entity.getEquipmentStatus());
+ resp.setEquipmentStatusLabel(EquipmentStatusEnum.getDescByCode(entity.getEquipmentStatus()));
+ resp.setUseStatus(entity.getUseStatus());
+ resp.setLocationStatus(entity.getLocationStatus());
+ resp.setLocationStatusLabel(LocationStatusEnum.getDescByCode(entity.getLocationStatus()));
+ resp.setPhysicalLocation(entity.getPhysicalLocation());
+ resp.setResponsiblePerson(entity.getResponsiblePerson());
+ resp.setHealthStatus(entity.getHealthStatus());
+ resp.setHealthStatusLabel(HealthStatusEnum.getDescByCode(entity.getHealthStatus()));
+ resp.setPurchaseTime(entity.getPurchaseTime());
+ resp.setInStockTime(entity.getInStockTime());
+ resp.setActivationTime(entity.getActivationTime());
+ resp.setExpectedScrapTime(entity.getExpectedScrapTime());
+ resp.setActualScrapTime(entity.getActualScrapTime());
+ resp.setStatusChangeTime(entity.getStatusChangeTime());
+ resp.setPurchaseOrder(entity.getPurchaseOrder());
+ resp.setSupplierName(entity.getSupplierName());
+ resp.setCurrentNetValue(entity.getCurrentNetValue());
+ resp.setDepreciationMethod(entity.getDepreciationMethod());
+ resp.setDepreciationYears(entity.getDepreciationYears());
+ resp.setSalvageValue(entity.getSalvageValue());
+ resp.setWarrantyExpireDate(entity.getWarrantyExpireDate());
+ resp.setLastMaintenanceDate(entity.getLastMaintenanceDate());
+ resp.setNextMaintenanceDate(entity.getNextMaintenanceDate());
+ resp.setMaintenancePerson(entity.getMaintenancePerson());
+ resp.setInventoryBarcode(entity.getInventoryBarcode());
+ resp.setAssetRemark(entity.getAssetRemark());
+
+ // 新增采购相关字段
+ resp.setAccountNumber(entity.getAccountNumber());
+ resp.setQuantity(entity.getQuantity());
+ resp.setUnitPrice(entity.getUnitPrice());
+ resp.setTotalPrice(entity.getTotalPrice());
+ resp.setInventoryBasis(entity.getInventoryBasis());
+ resp.setDynamicRecord(entity.getDynamicRecord());
+
+ // 新增字段转换
+ resp.setUsingDepartment(entity.getUsingDepartment());
+ resp.setBorrowingTime(entity.getBorrowingTime());
+ resp.setReturnTime(entity.getReturnTime());
+ resp.setOutStockTime(entity.getOutStockTime());
+ resp.setTotalUsageTime(entity.getTotalUsageTime());
+ resp.setDepreciationRate(entity.getDepreciationRate());
+ resp.setDepreciationMethodDesc(entity.getDepreciationMethodDesc());
+ resp.setInvoice(entity.getInvoice());
+ resp.setInvoiceStatus(entity.getInvoiceStatus());
+ resp.setAttachments(entity.getAttachments());
+ resp.setPhotos(entity.getPhotos());
+ resp.setBarcode(entity.getBarcode());
+ resp.setImporter(entity.getImporter());
+ resp.setInventoryTimeStatus1(entity.getInventoryTimeStatus1());
+ resp.setInventoryTimeStatus2(entity.getInventoryTimeStatus2());
+ resp.setInventoryTimeStatus3(entity.getInventoryTimeStatus3());
+ resp.setInventoryCheckTimeStatus1(entity.getInventoryCheckTimeStatus1());
+ resp.setInventoryCheckTimeStatus2(entity.getInventoryCheckTimeStatus2());
+ resp.setInventoryCheckTimeStatus3(entity.getInventoryCheckTimeStatus3());
+
+ resp.setCreateTime(entity.getCreateTime());
+ resp.setUpdateTime(entity.getUpdateTime());
+
+ return resp;
+ }
+
+ // 采购管理相关方法实现
+ @Override
+ public IPage procurementPage(EquipmentListReq req) {
+ log.info("开始执行设备采购记录分页查询,请求参数: {}", req);
+
+ // 创建分页对象,处理null值
+ Integer pageNum = req.getPage() != null ? req.getPage() : (req.getPageNum() != null ? req.getPageNum() : 1);
+ Integer pageSize = req.getPageSize() != null ? req.getPageSize() : 10;
+ Page page = new Page<>(pageNum, pageSize);
+
+ // 构建查询条件,参考设备分页查询的逻辑
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ // 不需要手动添加 del_flag 条件,@TableLogic 注解会自动处理
+
+ // 添加搜索条件并记录日志
+ int conditionCount = 0;
+
+ if (StringUtils.hasText(req.getEquipmentName())) {
+ queryWrapper.like(EquipmentEntity::getEquipmentName, req.getEquipmentName());
+ log.info("添加设备名称查询条件: {}", req.getEquipmentName());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getEquipmentType())) {
+ queryWrapper.eq(EquipmentEntity::getEquipmentType, req.getEquipmentType());
+ log.info("添加设备类型查询条件: {}", req.getEquipmentType());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getEquipmentStatus())) {
+ queryWrapper.eq(EquipmentEntity::getEquipmentStatus, req.getEquipmentStatus());
+ log.info("添加设备状态查询条件: {}", req.getEquipmentStatus());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getEquipmentSn())) {
+ queryWrapper.like(EquipmentEntity::getEquipmentSn, req.getEquipmentSn());
+ log.info("添加设备序列号查询条件: {}", req.getEquipmentSn());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getAssetCode())) {
+ queryWrapper.like(EquipmentEntity::getAssetCode, req.getAssetCode());
+ log.info("添加资产编号查询条件: {}", req.getAssetCode());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getBrand())) {
+ queryWrapper.like(EquipmentEntity::getBrand, req.getBrand());
+ log.info("添加品牌查询条件: {}", req.getBrand());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getLocationStatus())) {
+ queryWrapper.eq(EquipmentEntity::getLocationStatus, req.getLocationStatus());
+ log.info("添加位置状态查询条件: {}", req.getLocationStatus());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getHealthStatus())) {
+ queryWrapper.eq(EquipmentEntity::getHealthStatus, req.getHealthStatus());
+ log.info("添加健康状态查询条件: {}", req.getHealthStatus());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getResponsiblePerson())) {
+ queryWrapper.like(EquipmentEntity::getResponsiblePerson, req.getResponsiblePerson());
+ log.info("添加负责人查询条件: {}", req.getResponsiblePerson());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getPhysicalLocation())) {
+ queryWrapper.like(EquipmentEntity::getPhysicalLocation, req.getPhysicalLocation());
+ log.info("添加物理位置查询条件: {}", req.getPhysicalLocation());
+ conditionCount++;
+ }
+
+ // 添加采购相关的搜索条件
+ if (StringUtils.hasText(req.getPurchaseOrder())) {
+ queryWrapper.like(EquipmentEntity::getPurchaseOrder, req.getPurchaseOrder());
+ log.info("添加采购订单查询条件: {}", req.getPurchaseOrder());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getSupplierName())) {
+ queryWrapper.like(EquipmentEntity::getSupplierName, req.getSupplierName());
+ log.info("添加供应商查询条件: {}", req.getSupplierName());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getAccountNumber())) {
+ queryWrapper.like(EquipmentEntity::getAccountNumber, req.getAccountNumber());
+ log.info("添加次户号查询条件: {}", req.getAccountNumber());
+ conditionCount++;
+ }
+ if (req.getQuantity() != null) {
+ queryWrapper.eq(EquipmentEntity::getQuantity, req.getQuantity());
+ log.info("添加数量查询条件: {}", req.getQuantity());
+ conditionCount++;
+ }
+ if (req.getUnitPrice() != null) {
+ queryWrapper.eq(EquipmentEntity::getUnitPrice, req.getUnitPrice());
+ log.info("添加单价查询条件: {}", req.getUnitPrice());
+ conditionCount++;
+ }
+ if (req.getTotalPrice() != null) {
+ queryWrapper.eq(EquipmentEntity::getTotalPrice, req.getTotalPrice());
+ log.info("添加总价查询条件: {}", req.getTotalPrice());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getInventoryBasis())) {
+ queryWrapper.like(EquipmentEntity::getInventoryBasis, req.getInventoryBasis());
+ log.info("添加盘点依据查询条件: {}", req.getInventoryBasis());
+ conditionCount++;
+ }
+ if (StringUtils.hasText(req.getDynamicRecord())) {
+ queryWrapper.like(EquipmentEntity::getDynamicRecord, req.getDynamicRecord());
+ log.info("添加动态记录查询条件: {}", req.getDynamicRecord());
+ conditionCount++;
+ }
+
+ log.info("总共添加了 {} 个查询条件", conditionCount);
+
+ // 按采购时间倒序排列
+ queryWrapper.orderByDesc(EquipmentEntity::getPurchaseTime);
+
+ // 执行查询
+ IPage result = this.page(page, queryWrapper);
+
+ // 转换为响应对象
+ List records = result.getRecords().stream()
+ .map(this::convertToResp)
+ .collect(Collectors.toList());
+
+ // 创建新的分页结果
+ Page respPage = new Page<>(result.getCurrent(), result.getSize(), result.getTotal());
+ respPage.setRecords(records);
+
+ log.info("设备采购记录分页查询完成,总记录数: {}", result.getTotal());
+ return respPage;
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void saveProcurement(EquipmentReq req) {
+ log.info("开始新增设备采购记录,请求参数: {}", req);
+
+ // 验证采购订单号唯一性
+ if (StringUtils.hasText(req.getPurchaseOrder())) {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(EquipmentEntity::getPurchaseOrder, req.getPurchaseOrder());
+ long count = this.count(queryWrapper);
+ if (count > 0) {
+ throw new ServiceException("采购订单号已存在");
+ }
+ }
+
+ // 设置采购相关的时间字段
+ if (req.getPurchaseTime() == null) {
+ req.setPurchaseTime(LocalDateTime.now());
+ }
+
+ // 转换为实体并保存
+ EquipmentEntity entity = convertToEntity(req);
+ this.save(entity);
+
+ log.info("设备采购记录新增成功,设备ID: {}", entity.getEquipmentId());
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void updateProcurement(String equipmentId, EquipmentReq req) {
+ log.info("开始修改设备采购记录,设备ID: {}, 请求参数: {}", equipmentId, req);
+
+ // 检查设备是否存在
+ EquipmentEntity existingEntity = this.getById(equipmentId);
+ if (existingEntity == null) {
+ throw new ServiceException("设备不存在");
+ }
+
+ // 验证采购订单号唯一性(排除当前设备)
+ if (StringUtils.hasText(req.getPurchaseOrder())) {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(EquipmentEntity::getPurchaseOrder, req.getPurchaseOrder())
+ .ne(EquipmentEntity::getEquipmentId, equipmentId);
+ long count = this.count(queryWrapper);
+ if (count > 0) {
+ throw new ServiceException("采购订单号已存在");
+ }
+ }
+
+ // 转换为实体并更新
+ EquipmentEntity entity = convertToEntity(req);
+ entity.setEquipmentId(equipmentId);
+ this.updateById(entity);
+
+ log.info("设备采购记录修改成功,设备ID: {}", equipmentId);
+ }
+
+ @Override
+ public Object getProcurementStats() {
+ log.info("开始获取采购统计信息");
+
+ // 统计采购总金额
+ LambdaQueryWrapper priceWrapper = new LambdaQueryWrapper<>();
+ priceWrapper.isNotNull(EquipmentEntity::getTotalPrice);
+ List priceEntities = this.list(priceWrapper);
+ double totalAmount = priceEntities.stream()
+ .mapToDouble(entity -> entity.getTotalPrice() != null ? entity.getTotalPrice().doubleValue() : 0)
+ .sum();
+
+ // 统计供应商数量
+ LambdaQueryWrapper supplierWrapper = new LambdaQueryWrapper<>();
+ supplierWrapper.isNotNull(EquipmentEntity::getSupplierName)
+ .groupBy(EquipmentEntity::getSupplierName);
+ long supplierCount = this.count(supplierWrapper);
+
+ // 统计采购设备数量
+ LambdaQueryWrapper equipmentWrapper = new LambdaQueryWrapper<>();
+ equipmentWrapper.isNotNull(EquipmentEntity::getPurchaseOrder);
+ long equipmentCount = this.count(equipmentWrapper);
+
+ // 构建统计结果
+ java.util.Map stats = new java.util.HashMap<>();
+ stats.put("totalAmount", totalAmount);
+ stats.put("supplierCount", supplierCount);
+ stats.put("equipmentCount", equipmentCount);
+ stats.put("averageAmount", equipmentCount > 0 ? totalAmount / equipmentCount : 0);
+
+ log.info("采购统计信息获取完成,总金额: {}, 供应商数: {}, 设备数: {}", totalAmount, supplierCount, equipmentCount);
+ return stats;
+ }
}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/InMemoryVerificationCodeStore.java b/core/src/main/java/com/dite/znpt/service/impl/InMemoryVerificationCodeStore.java
new file mode 100644
index 0000000..fb11b9c
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/impl/InMemoryVerificationCodeStore.java
@@ -0,0 +1,74 @@
+package com.dite.znpt.service.impl;
+
+import lombok.Data;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component
+public class InMemoryVerificationCodeStore {
+
+ // 存储邮箱验证码的map
+ private final Map emailCodeMap = new ConcurrentHashMap<>();
+
+ public void save(String email, String code){
+ // 设置五分钟过期
+ emailCodeMap.put(email,new codeInfo(code, LocalDateTime.now().plusMinutes(5)));
+ }
+
+ /**
+ * 验证验证码
+ * @param email
+ * @param code
+ * @return
+ */
+ public boolean validate(String email, String code){
+ codeInfo codeInfo = emailCodeMap.get(email);
+ if(codeInfo == null){
+ return false;
+ }
+
+ boolean isValid = false;
+ if(code.equals(codeInfo.getCode()) && LocalDateTime.now().isBefore(codeInfo.getExpireTime())){
+ isValid = true;
+ }
+ if(isValid){
+ emailCodeMap.remove(email);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * 判断邮箱是否可发送验证码
+ * @param email
+ * @return
+ */
+ public boolean canSend(String email){
+ codeInfo codeInfo = emailCodeMap.get(email);
+ if(codeInfo != null && LocalDateTime.now().isBefore(codeInfo.getExpireTime())){
+ return false;
+ }
+ return true;
+ }
+
+ @Data
+ public static class codeInfo {
+ // 验证码
+ private String code;
+
+ // 过期时间
+ private LocalDateTime expireTime;
+
+ // 上一次发送时间
+ private LocalDateTime lastSendTime;
+
+ public codeInfo(String code, LocalDateTime expireTime){
+ this.code = code;
+ this.expireTime = expireTime;
+ this.lastSendTime = LocalDateTime.now();
+ }
+ }
+}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectBudgetInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectBudgetInfoServiceImpl.java
index 5380782..d6e847f 100644
--- a/core/src/main/java/com/dite/znpt/service/impl/ProjectBudgetInfoServiceImpl.java
+++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectBudgetInfoServiceImpl.java
@@ -1,25 +1,24 @@
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.entity.ProjectEntity;
+import com.dite.znpt.domain.vo.ProjectBudgetInfoDetailResp;
+import com.dite.znpt.domain.vo.ProjectBudgetInfoImportReq;
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.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 +29,98 @@ import java.util.List;
@Service
@RequiredArgsConstructor
public class ProjectBudgetInfoServiceImpl extends ServiceImpl 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 selectList(ProjectBudgetInfoListReq projectBudgetInfoReq) {
- PageUtil.startPage();
- List 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 detailByProjectId(String projectId) {
- List 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) {
- List 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 list(ProjectBudgetInfoListReq req) {
+ List 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 page(ProjectBudgetInfoListReq req) {
+ PageUtil.startPage();
+ return this.list(req);
+ }
+
+ @Override
+ public void saveData(ProjectBudgetInfoImportReq req) {
+ ProjectBudgetInfoEntity entity = BeanUtil.copyProperties(req, ProjectBudgetInfoEntity.class);
+ ProjectEntity projectEntity = projectService.getById(req.getProjectId());
+ switch (req.getBudgetName()) {
+ case "人工成本":
+ projectEntity.setUseLaborCost(projectEntity.getUseLaborCost() + req.getBudgetAmount());
+ break;
+ case "设备摊销":
+ projectEntity.setUseEquipmentAmortization(projectEntity.getUseEquipmentAmortization() + req.getBudgetAmount());
+ break;
+ case "奖金预提":
+ projectEntity.setUseBonusProvision(projectEntity.getUseBonusProvision() + req.getBudgetAmount());
+ break;
+ case "交通食宿":
+ projectEntity.setUseTransAccomMeals(projectEntity.getUseTransAccomMeals() + req.getBudgetAmount());
+ break;
+ case "其他杂费":
+ projectEntity.setUseOthersCost(projectEntity.getUseOthersCost() + req.getBudgetAmount());
+ break;
+ default:
+ break;
+ }
+ projectService.updateById(projectEntity);
+ 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;
+ }
+
+ @Override
+ public void delete(String budgetId) {
+ ProjectBudgetInfoEntity entity = this.baseMapper.selectById(budgetId);
+ ProjectEntity projectEntity = projectService.getById(entity.getProjectId());
+ switch (entity.getBudgetName()) {
+ case "人工成本":
+ projectEntity.setUseLaborCost(projectEntity.getUseLaborCost() - entity.getBudgetAmount());
+ break;
+ case "设备摊销":
+ projectEntity.setUseEquipmentAmortization(projectEntity.getUseEquipmentAmortization() - entity.getBudgetAmount());
+ break;
+ case "奖金预提":
+ projectEntity.setUseBonusProvision(projectEntity.getUseBonusProvision() - entity.getBudgetAmount());
+ break;
+ case "交通食宿":
+ projectEntity.setUseTransAccomMeals(projectEntity.getUseTransAccomMeals() - entity.getBudgetAmount());
+ break;
+ case "其他杂费":
+ projectEntity.setUseOthersCost(projectEntity.getUseOthersCost() - entity.getBudgetAmount());
+ break;
+ default:
+ break;
+ }
+ projectService.updateById(projectEntity);
+ this.baseMapper.deleteById(budgetId);
+ // 删除附件
+ }
}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java
index 8c51d1d..9ee100e 100644
--- a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java
+++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java
@@ -19,6 +19,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
@@ -293,7 +294,51 @@ public class ProjectMemberServiceImpl extends ServiceImpl projectMembers = selectByProjectId(projectId);
+ resp.setProjectMembers(projectMembers);
+
+ // 计算团队规模
+ resp.setTeamSize(projectMembers.size());
+
+ // 获取项目经理信息
+ String managerName = projectMembers.stream()
+ .filter(member -> "PROJECT_MANAGER".equals(member.getRoleType()))
+ .map(ProjectMemberResp::getUserName)
+ .findFirst()
+ .orElse("");
+ resp.setManager(managerName);
+
+ // 计算项目预算(从预算信息中汇总)
+ List budgets = projectBudgetInfoService.lambdaQuery()
+ .eq(ProjectBudgetInfoEntity::getProjectId, projectId)
+ .list();
+ BigDecimal totalBudget = budgets.stream()
+ .map(budget -> BigDecimal.valueOf(budget.getBudgetAmount()))
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
+ resp.setBudget(totalBudget);
+
+ // 计算项目进度
+ List tasks = projectTaskService.lambdaQuery()
+ .eq(ProjectTaskEntity::getProjectId, projectId)
+ .list();
+ if (!tasks.isEmpty()) {
+ long completedTasks = tasks.stream()
+ .filter(task -> task.getStatus() != null && task.getStatus() == 2)
+ .count();
+ resp.setProgress((int) (completedTasks * 100 / tasks.size()));
+ } else {
+ resp.setProgress(0);
+ }
+
+ // 计算准备进度(基于任务状态)
+ if (!tasks.isEmpty()) {
+ long preparedTasks = tasks.stream()
+ .filter(task -> task.getStatus() != null && task.getStatus() >= 1)
+ .count();
+ resp.setPreparationProgress((int) (preparedTasks * 100 / tasks.size()));
+ } else {
+ resp.setPreparationProgress(0);
+ }
// 获取项目机组信息
List turbines = turbineService.lambdaQuery()
@@ -307,9 +352,6 @@ public class ProjectMemberServiceImpl extends ServiceImpl tasks = projectTaskService.lambdaQuery()
- .eq(ProjectTaskEntity::getProjectId, projectId)
- .list();
resp.setTasks(tasks.stream().map(task -> {
ProjectDetailResp.TaskInfo info = new ProjectDetailResp.TaskInfo();
BeanUtil.copyProperties(task, info);
@@ -318,9 +360,6 @@ public class ProjectMemberServiceImpl extends ServiceImpl budgets = projectBudgetInfoService.lambdaQuery()
- .eq(ProjectBudgetInfoEntity::getProjectId, projectId)
- .list();
resp.setBudgets(budgets.stream().map(budget -> {
ProjectDetailResp.BudgetInfo info = new ProjectDetailResp.BudgetInfo();
BeanUtil.copyProperties(budget, info);
@@ -381,6 +420,22 @@ public class ProjectMemberServiceImpl extends ServiceImpl teamMembers = members.stream()
+ .map(member -> {
+ ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp teamMember = new ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp();
+ BeanUtil.copyProperties(member, teamMember);
+ return teamMember;
+ })
+ .collect(Collectors.toList());
+ item.setTeamMembers(teamMembers);
+
// 统计机组数量
Long turbineCount = turbineService.lambdaQuery()
.eq(TurbineEntity::getProjectId, project.getProjectId())
@@ -403,10 +458,32 @@ public class ProjectMemberServiceImpl extends ServiceImpl 0) {
item.setProgressPercentage((int) (completedTaskCount * 100 / taskCount));
+ item.setProgress((int) (completedTaskCount * 100 / taskCount));
} else {
item.setProgressPercentage(0);
+ item.setProgress(0);
}
+ // 计算准备进度(基于任务状态)
+ if (taskCount > 0) {
+ Long preparedTasks = projectTaskService.lambdaQuery()
+ .eq(ProjectTaskEntity::getProjectId, project.getProjectId())
+ .ge(ProjectTaskEntity::getStatus, 1)
+ .count();
+ item.setPreparationProgress((int) (preparedTasks * 100 / taskCount));
+ } else {
+ item.setPreparationProgress(0);
+ }
+
+ // 计算项目预算(从预算信息中汇总)
+ List budgets = projectBudgetInfoService.lambdaQuery()
+ .eq(ProjectBudgetInfoEntity::getProjectId, project.getProjectId())
+ .list();
+ BigDecimal totalBudget = budgets.stream()
+ .map(budget -> BigDecimal.valueOf(budget.getBudgetAmount()))
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
+ item.setBudget(totalBudget);
+
return item;
}).collect(Collectors.toList());
}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java
index e505d14..71746fc 100644
--- a/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java
+++ b/core/src/main/java/com/dite/znpt/service/impl/UserPostServiceImpl.java
@@ -10,6 +10,7 @@ import com.dite.znpt.domain.entity.PostEntity;
import com.dite.znpt.domain.entity.UserEntity;
import com.dite.znpt.domain.entity.UserPostEntity;
import com.dite.znpt.domain.vo.PostResp;
+import com.dite.znpt.domain.vo.UserResp;
import com.dite.znpt.exception.ServiceException;
import com.dite.znpt.mapper.UserPostMapper;
import com.dite.znpt.service.PostService;
@@ -88,4 +89,14 @@ public class UserPostServiceImpl extends ServiceImpl getUsersByPostId(String postId) {
+ List userIds = this.list(Wrappers.lambdaQuery(UserPostEntity.class).eq(UserPostEntity::getPostId, postId)).stream().map(UserPostEntity::getUserId).toList();
+ if (CollUtil.isEmpty(userIds)) {
+ return new ArrayList<>();
+ }
+ List users = userService.listByIds(userIds).stream().filter(user -> Constants.DEL_FLAG_0.equals(user.getDelFlag()) && Constants.STATUS_0.equals(user.getStatus())).toList();
+ return Converts.INSTANCE.toUserResp(users);
+ }
}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java
index 1299612..f4dea0e 100644
--- a/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java
+++ b/core/src/main/java/com/dite/znpt/service/impl/UserRoleServiceImpl.java
@@ -10,6 +10,7 @@ import com.dite.znpt.domain.entity.RoleEntity;
import com.dite.znpt.domain.entity.UserEntity;
import com.dite.znpt.domain.entity.UserRoleEntity;
import com.dite.znpt.domain.vo.RoleResp;
+import com.dite.znpt.domain.vo.UserResp;
import com.dite.znpt.domain.vo.UserRoleReq;
import com.dite.znpt.exception.ServiceException;
import com.dite.znpt.mapper.UserRoleMapper;
@@ -88,4 +89,14 @@ public class UserRoleServiceImpl extends ServiceImpl getUsersByRoleId(String roleId) {
+ List userIds = this.list(Wrappers.lambdaQuery(UserRoleEntity.class).eq(UserRoleEntity::getRoleId, roleId)).stream().map(UserRoleEntity::getUserId).toList();
+ if (CollUtil.isEmpty(userIds)) {
+ return new ArrayList<>();
+ }
+ List users = userService.listByIds(userIds).stream().filter(user -> Constants.DEL_FLAG_0.equals(user.getDelFlag()) && Constants.STATUS_0.equals(user.getStatus())).toList();
+ return Converts.INSTANCE.toUserResp(users);
+ }
}
diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java
index cd4c41d..d3516d1 100644
--- a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java
+++ b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java
@@ -107,7 +107,7 @@ public class UserServiceImpl extends ServiceImpl impleme
UserEntity entity = this.getById(userId);
UserResp userResp= Converts.INSTANCE.toUserResp(entity);
if(StrUtil.isNotBlank(userResp.getDeptId())){
- userResp.setUserName(entity.getName());
+ userResp.setName(entity.getName());
userResp.setDeptName(deptService.getById(userResp.getDeptId()).getDeptName());
}
userResp.setUserTypeLabel(UserTypeEnum.getDescByCode(userResp.getUserType()));
@@ -198,6 +198,9 @@ public class UserServiceImpl extends ServiceImpl impleme
if(CollUtil.isNotEmpty(req.getPostIds())){
userPostService.bindUserPost(userId, req.getPostIds());
}
+ if(CollUtil.isNotEmpty(req.getRoleIds())){
+ userRoleService.bindUserRole(new UserRoleReq().setUserId(userId).setRoleIds(req.getRoleIds()));
+ }
this.updateById(entity);
}
diff --git a/core/src/main/resources/mapper/BusinessDataFileMapper.xml b/core/src/main/resources/mapper/BusinessDataFileMapper.xml
new file mode 100644
index 0000000..3a129f4
--- /dev/null
+++ b/core/src/main/resources/mapper/BusinessDataFileMapper.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+ delete from business_data_part_file
+
+
+ and file_id = #{fileId}
+
+
+ and folder_id = #{folderId}
+
+
+
+
+
+
+ insert into business_data_part_file (file_id, folder_id, file_name, file_path, file_type, file_size, upload_time, uploader_id, is_deleted)
+ values (#{fileId}, #{folderId}, #{fileName}, #{filePath}, #{fileType}, #{fileSize}, #{uploadTime}, #{uploaderId}, #{isDeleted})
+
+
+
+
+ update business_data_part_file
+
+ file_name = #{newFileName},
+ file_path = #{newFilePath},
+
+ where file_id = #{fileId}
+
+
+
diff --git a/core/src/main/resources/mapper/BusinessDataMapper.xml b/core/src/main/resources/mapper/BusinessDataMapper.xml
new file mode 100644
index 0000000..f714eae
--- /dev/null
+++ b/core/src/main/resources/mapper/BusinessDataMapper.xml
@@ -0,0 +1,55 @@
+
+
+
+
+ insert into business_data_part
+
+ folder_name,
+ parent_id,
+ creator_id,
+ create_time,
+ update_time,
+ is_deleted,
+ folder_path,
+
+
+ #{folderName},
+ #{parentId},
+ #{creatorId},
+ #{createTime},
+ #{updateTime},
+ #{isDeleted},
+ #{folderPath},
+
+
+
+
+
+
+
+
+ delete from business_data_part where folder_id = #{folderId}
+
+
+ update business_data_part
+
+ folder_name = #{folderName},
+ update_time = #{updateTime},
+ folder_path = #{folderPath},
+
+ where folder_id = #{folderId}
+
+
+
+
diff --git a/core/src/main/resources/mapper/ContractMapper.xml b/core/src/main/resources/mapper/ContractMapper.xml
index c2a698d..078d6e2 100644
--- a/core/src/main/resources/mapper/ContractMapper.xml
+++ b/core/src/main/resources/mapper/ContractMapper.xml
@@ -38,9 +38,6 @@
and a.department_id like concat ('%', #{departmentId}, '%')
-
- and a.sign_date = #{signDate}
-
and a.duration like concat ('%', #{duration}, '%')
@@ -50,12 +47,6 @@
and a.product_service like concat ('%', #{productService}, '%')
-
- and a.payment_date = #{paymentDate}
-
-
- and a.performance_deadline = #{performanceDeadline}
-
and a.payment_address like concat ('%', #{paymentAddress}, '%')
diff --git a/core/src/main/resources/mapper/ProjectBudgetInfoMapper.xml b/core/src/main/resources/mapper/ProjectBudgetInfoMapper.xml
index 5425a2b..d8cd25a 100644
--- a/core/src/main/resources/mapper/ProjectBudgetInfoMapper.xml
+++ b/core/src/main/resources/mapper/ProjectBudgetInfoMapper.xml
@@ -3,47 +3,24 @@
- 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
-
-
diff --git a/core/src/main/resources/mapper/ProjectMapper.xml b/core/src/main/resources/mapper/ProjectMapper.xml
index a603780..5f9a8e5 100644
--- a/core/src/main/resources/mapper/ProjectMapper.xml
+++ b/core/src/main/resources/mapper/ProjectMapper.xml
@@ -16,7 +16,7 @@
GROUP BY prj.project_id
)
SELECT
- prj.project_id, prj.project_name, prj.farm_name, prj.status, prj.cover_url, prj.farm_address, prj.client, prj.client_contact, prj.client_phone, prj.inspection_unit,
+ prj.project_id, prj.project_origin, prj.project_budget, prj.project_name, prj.farm_name, prj.status, prj.cover_url, prj.farm_address, prj.client, prj.client_contact, prj.client_phone, prj.inspection_unit,
prj.inspection_contact, prj.inspection_phone, prj.scale, prj.turbine_model, prj.project_manager_id, pm.name AS project_manager_name, prj.constructor_ids,
prj.start_date, prj.end_date, con.constructor_name, tp.taskPendingCount, tp.task_progress_count, tp.task_complete_count, tp.task_count, prj.auditor_id,
prj.construct_team_leader_id, prj.quality_officer_id
diff --git a/core/src/main/resources/mapper/UserMapper.xml b/core/src/main/resources/mapper/UserMapper.xml
index 36b314a..abec525 100644
--- a/core/src/main/resources/mapper/UserMapper.xml
+++ b/core/src/main/resources/mapper/UserMapper.xml
@@ -8,37 +8,55 @@
diff --git a/flowable/pom.xml b/flowable/pom.xml
index edd8467..d11bf74 100644
--- a/flowable/pom.xml
+++ b/flowable/pom.xml
@@ -11,6 +11,10 @@
flowable
1.0.0-SNAPSHOT
+
+ UTF-8
+
+
com.dite.znpt
diff --git a/pom.xml b/pom.xml
index 4991235..fcdc462 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,6 +12,7 @@
core
+ sip
web
flowable
diff --git a/web/pom.xml b/web/pom.xml
index 4dd81fc..c6d6423 100644
--- a/web/pom.xml
+++ b/web/pom.xml
@@ -20,11 +20,11 @@
-
-
-
-
-
+
+ com.dite.znpt
+ sip
+ 1.0.0-SNAPSHOT
+
com.dite.znpt
core
diff --git a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataController.java b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataController.java
new file mode 100644
index 0000000..13fb7eb
--- /dev/null
+++ b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataController.java
@@ -0,0 +1,58 @@
+package com.dite.znpt.web.controller;
+
+import com.dite.znpt.domain.Result;
+import com.dite.znpt.domain.dto.FolderDto;
+import com.dite.znpt.domain.page.PageBean;
+import com.dite.znpt.service.BusinessDataService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/*
+ * @Description: 商务资料管理,文件夹层
+ * 虽然文件夹本质也是文件,但我们页面上很多地方,光查文件信息,根据文件夹ID
+ * 获取文件列表,如果文件夹和文件都放一张表,不好区分,接口也不好区分,这样分开写方便
+ */
+@Api(tags = "文件夹接口")
+@RestController
+@Slf4j
+@RequestMapping("/businessData/folder")
+@ApiOperation("商务资料管理,文件夹contrller层")
+public class BusinessDataController {
+ @Resource
+ private BusinessDataService businessDataService;
+
+ @ApiOperation(value = "分页查询文件夹", httpMethod = "GET")
+ @GetMapping("/list")
+ public Result pageSelect(@RequestParam(defaultValue = "1") Integer page,
+ @RequestParam(defaultValue = "10") Integer pageSize,
+ @RequestParam(required = false) String folderName) {
+ PageBean pageBean = businessDataService.pageSelect(page, pageSize, folderName);
+ return Result.ok(pageBean);
+ }
+
+
+ @ApiOperation(value = "增加文件夹", httpMethod = "POST")
+ @PostMapping("/creatFolder")
+ public Result createFolder(@RequestBody FolderDto folderDto) {
+ return businessDataService.createFolder(folderDto.getName(), folderDto.getParentId());
+ }
+
+ @ApiOperation(value = "删除文件夹", httpMethod = "DELETE")
+ @DeleteMapping("/delete")
+ public Result delete(@RequestParam Long folderId) {
+
+ return businessDataService.delete(folderId);
+ }
+
+ @ApiOperation(value = "重命名文件夹", httpMethod = "PUT")
+ @PutMapping("/rename")
+ public Result Rename(@RequestParam Long folderId, @RequestParam String newName) {
+
+ return businessDataService.reName(folderId, newName);
+ }
+
+}
diff --git a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java
new file mode 100644
index 0000000..a54e8f2
--- /dev/null
+++ b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java
@@ -0,0 +1,137 @@
+package com.dite.znpt.web.controller;
+
+import com.dite.znpt.domain.Result;
+import com.dite.znpt.domain.entity.BusinessDataFileEntity;
+import com.dite.znpt.domain.page.PageBean;
+import com.dite.znpt.mapper.BusinessDataFileMapper;
+import com.dite.znpt.service.BusinessDataFileService;
+import com.dite.znpt.service.BusinessDataService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.util.Date;
+
+/*
+ * @Description: 商务资料管理,文件夹层
+ */
+
+@Api(tags = "文件接口")
+@RestController
+@Slf4j
+@RequestMapping("/businessData/file")
+@ApiOperation("商务资料管理,文件层")
+public class BusinessDataFileController {
+ @Resource
+ private BusinessDataFileService businessDataFileService;
+ @Resource
+ private BusinessDataService businessDataService;
+ @Resource
+ private BusinessDataFileMapper businessDataFileMapper;
+
+ @ApiOperation(value = "分页查询文件", httpMethod = "GET")
+ @GetMapping("/list")
+ public Result pageSelect(@RequestParam(defaultValue = "1") Integer page,
+ @RequestParam(defaultValue = "10") Integer pageSize,
+ @RequestParam(defaultValue = "0") Long folderId,
+ @RequestParam(required = false) String fileName) {
+ PageBean pageBean = businessDataFileService.pageSelect(page, pageSize, folderId, fileName);
+ return Result.ok(pageBean);
+ }
+
+ @ApiOperation(value = "增加文件")
+ @PostMapping("/add")
+ public Result add(@RequestParam("file") MultipartFile file,
+ @RequestParam Long folderId) {
+
+ if (file.isEmpty()) {
+ return Result.error("上传文件为空");
+ }
+ // TODO 以后可以优化,就算文件名一样,加个(1),(2)这种
+
+ try {
+ byte[] bytes = file.getBytes();
+ String uploadDir = businessDataService.getPath(folderId);
+
+ File uploadedFile = new File(uploadDir + "\\" + file.getOriginalFilename());
+ if (uploadedFile.exists()) {
+ return Result.error("文件已存在");
+ }
+ file.transferTo(uploadedFile);
+
+ // 保存文件信息到数据
+ BusinessDataFileEntity fileEntity = new BusinessDataFileEntity();
+ fileEntity.setFolderId(folderId);
+ fileEntity.setFileName(file.getOriginalFilename());
+ fileEntity.setFilePath(uploadDir + "\\" + file.getOriginalFilename());
+ fileEntity.setFileType(file.getContentType());
+ fileEntity.setFileSize(file.getSize());
+ fileEntity.setUploadTime(new Date());
+ fileEntity.setUploaderId(0L);
+ System.out.println(uploadDir + "\\" + file.getOriginalFilename());
+ businessDataFileService.add(fileEntity);
+
+ return Result.okM("上传成功");
+ } catch (IOException e) {
+ e.printStackTrace();
+ return Result.error("上传失败");
+ }
+ }
+
+ @ApiOperation(value = "删除文件")
+ @DeleteMapping("/delete")
+ public Result delete(@RequestParam Long fileId) {
+ businessDataFileService.delete(fileId, null);
+ return Result.okM("删除成功");
+ }
+
+ @ApiOperation(value = "下载文件")
+ @GetMapping("/download")
+ public void download(@RequestParam("fileId") Long fileId, HttpServletResponse response) {
+ String path = businessDataFileService.getPath(fileId);
+ try {
+ // path是指想要下载的文件的路径
+ File file = new File(path);
+ log.info(file.getPath());
+ // 获取文件名
+ String filename = file.getName();
+ // 获取文件后缀名
+ String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
+ log.info("文件后缀名:" + ext);
+
+ // 将文件写入输入流
+ FileInputStream fileInputStream = new FileInputStream(file);
+ InputStream fis = new BufferedInputStream(fileInputStream);
+ byte[] buffer = new byte[fis.available()];
+ fis.read(buffer);
+ fis.close();
+
+ // 清空response
+ response.reset();
+ // 设置response的Header
+ response.setCharacterEncoding("UTF-8");
+ response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
+ // 告知浏览器文件的大小
+ response.addHeader("Content-Length", "" + file.length());
+ OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
+ response.setContentType("application/octet-stream");
+ outputStream.write(buffer);
+ outputStream.flush();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ @ApiOperation(value = "重命名文件", httpMethod = "PUT")
+ @PutMapping("/rename")
+ public Result reName(@RequestParam Long fileId, @RequestParam String newFileName) {
+ return businessDataFileService.reName(fileId, newFileName);
+ }
+
+}
diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java
index 5371ed3..b609870 100644
--- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java
+++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java
@@ -175,5 +175,11 @@ public class CommonController {
return Result.ok(EquipmentTypeEnum.listAll());
}
+ @ApiOperation(value = "查询合同状态", httpMethod = "GET")
+ @GetMapping("/list/contract-status")
+ public Result> listContractStatus(){
+ return Result.ok(ContractStatusEnum.listAll());
+ }
+
}
diff --git a/web/src/main/java/com/dite/znpt/web/controller/EmailController.java b/web/src/main/java/com/dite/znpt/web/controller/EmailController.java
new file mode 100644
index 0000000..ab3007a
--- /dev/null
+++ b/web/src/main/java/com/dite/znpt/web/controller/EmailController.java
@@ -0,0 +1,46 @@
+//package com.dite.znpt.web.controller;
+//
+//import com.dite.znpt.domain.Result;
+//import com.dite.znpt.domain.entity.UserEntity;
+//import com.dite.znpt.service.EmailService;
+//import com.dite.znpt.service.UserService;
+//import io.swagger.annotations.Api;
+//import io.swagger.annotations.ApiOperation;
+//import org.springframework.web.bind.annotation.PostMapping;
+//import org.springframework.web.bind.annotation.RequestParam;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//import javax.annotation.Resource;
+//
+//@Api(tags = "邮件")
+//@RestController("/email")
+//public class EmailController {
+// @Resource
+// private EmailService emailService;
+//
+// @Resource
+// private UserService userService;
+//
+// @ApiOperation(value = "发送邮箱验证码", httpMethod = "POST")
+// @PostMapping("/send")
+// public Result> send(@RequestParam("email") String email) {
+// boolean send = emailService.sendVerificationCode(email, emailService.generateCode(email));
+// if (send) {
+// return Result.ok("发送成功");
+// }
+// return Result.error("发送失败");
+// }
+//
+// @ApiOperation(value = "验证邮箱验证码", httpMethod = "POST")
+// @PostMapping("/verify")
+// public Result> verify(@RequestParam("userId") String userId, @RequestParam("email") String email, @RequestParam("code") String code) {
+// boolean verify = emailService.verifyCode(email, code);
+// if (verify) {
+// UserEntity userEntity = userService.getById(userId);
+// userEntity.setEmail(email);
+// userService.updateById(userEntity);
+// return Result.ok("验证成功");
+// }
+// return Result.error("验证失败");
+// }
+//}
diff --git a/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java
index 238e447..bbfdccb 100644
--- a/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java
+++ b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java
@@ -1,5 +1,6 @@
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.EquipmentListReq;
@@ -8,35 +9,33 @@ import com.dite.znpt.domain.vo.EquipmentResp;
import com.dite.znpt.service.EquipmentService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
-import java.util.List;
/**
* @author Bear.G
* @date 2025/7/23/周三 17:41
* @description
*/
-@Api(tags = "设备信息")
+@Api(tags = "设备信息----------------------------")
@RestController
@RequestMapping("/equipment")
public class EquipmentController {
+ private static final Logger log = LoggerFactory.getLogger(EquipmentController.class);
+
@Resource
private EquipmentService equipmentService;
@ApiOperation(value = "分页查询设备信息列表", httpMethod = "GET")
@GetMapping("/page")
public PageResult page(EquipmentListReq req) {
- return PageResult.ok(equipmentService.page(req));
- }
-
- @ApiOperation(value = "查询设备信息列表", httpMethod = "GET")
- @GetMapping("/list")
- public Result> list(EquipmentListReq req) {
- return Result.ok(equipmentService.list(req));
+ IPage page = equipmentService.page(req);
+ return PageResult.ok(page.getRecords(), page.getTotal());
}
@ApiOperation(value = "查询设备信息详情", httpMethod = "GET")
@@ -66,4 +65,47 @@ public class EquipmentController {
return Result.ok();
}
+ @ApiOperation(value = "查询设备采购记录", httpMethod = "GET")
+ @GetMapping("/procurement/page")
+ public PageResult procurementPage(EquipmentListReq req) {
+ log.info("=== 设备采购记录查询接口被调用 ===");
+ log.info("接收到的请求参数: {}", req);
+ log.info("设备名称: {}", req.getEquipmentName());
+ log.info("设备类型: {}", req.getEquipmentType());
+ log.info("供应商名称: {}", req.getSupplierName());
+ log.info("采购订单号: {}", req.getPurchaseOrder());
+ log.info("次户号: {}", req.getAccountNumber());
+ log.info("数量: {}", req.getQuantity());
+ log.info("单价: {}", req.getUnitPrice());
+ log.info("总价: {}", req.getTotalPrice());
+ log.info("盘点依据: {}", req.getInventoryBasis());
+ log.info("动态记录: {}", req.getDynamicRecord());
+ log.info("页码: {}", req.getPage());
+ log.info("每页大小: {}", req.getPageSize());
+ log.info("排序字段: {}", req.getOrderBy());
+ log.info("排序方向: {}", req.getOrderDirection());
+
+ IPage page = equipmentService.procurementPage(req);
+ return PageResult.ok(page.getRecords(), page.getTotal());
+ }
+
+ @ApiOperation(value = "新增设备采购记录", httpMethod = "POST")
+ @PostMapping("/procurement")
+ public Result> addProcurement(@Validated @RequestBody EquipmentReq req){
+ equipmentService.saveProcurement(req);
+ return Result.ok();
+ }
+
+ @ApiOperation(value = "修改设备采购记录", httpMethod = "PUT")
+ @PutMapping("/procurement/{equipmentId}")
+ public Result> editProcurement(@PathVariable String equipmentId, @Validated @RequestBody EquipmentReq req){
+ equipmentService.updateProcurement(equipmentId, req);
+ return Result.ok();
+ }
+
+ @ApiOperation(value = "获取采购统计信息", httpMethod = "GET")
+ @GetMapping("/procurement/stats")
+ public Result> getProcurementStats(){
+ return Result.ok(equipmentService.getProcurementStats());
+ }
}
diff --git a/web/src/main/java/com/dite/znpt/web/controller/PostController.java b/web/src/main/java/com/dite/znpt/web/controller/PostController.java
index 9d9b49c..f9231f0 100644
--- a/web/src/main/java/com/dite/znpt/web/controller/PostController.java
+++ b/web/src/main/java/com/dite/znpt/web/controller/PostController.java
@@ -1,11 +1,15 @@
package com.dite.znpt.web.controller;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.dite.znpt.domain.PageResult;
import com.dite.znpt.domain.Result;
+import com.dite.znpt.domain.entity.UserPostEntity;
import com.dite.znpt.domain.vo.PostListReq;
import com.dite.znpt.domain.vo.PostReq;
import com.dite.znpt.domain.vo.PostResp;
+import com.dite.znpt.domain.vo.UserResp;
import com.dite.znpt.service.PostService;
+import com.dite.znpt.service.UserPostService;
import com.dite.znpt.util.ValidationGroup;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -27,6 +31,9 @@ public class PostController {
@Resource
private PostService postService;
+ @Resource
+ private UserPostService userPostService;
+
@ApiOperation(value = "分页查询岗位信息列表", httpMethod = "GET")
@GetMapping("/page")
public PageResult page(PostListReq req){
@@ -62,8 +69,14 @@ public class PostController {
@ApiOperation(value = "删除岗位信息", httpMethod = "DELETE")
@DeleteMapping("/{postId}")
public Result> remove(@PathVariable String postId){
+ userPostService.remove(new QueryWrapper().eq("post_id", postId));
postService.deleteById(postId);
return Result.ok();
}
+ @ApiOperation(value="查询属于该岗位的用户", httpMethod = "GET")
+ @GetMapping("/{postId}/user")
+ public Result> listUser(@PathVariable String postId){
+ return Result.ok(userPostService.getUsersByPostId(postId));
+ }
}
diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectBudgetInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectBudgetInfoController.java
index 3771898..c59a9ec 100644
--- a/web/src/main/java/com/dite/znpt/web/controller/ProjectBudgetInfoController.java
+++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectBudgetInfoController.java
@@ -3,10 +3,10 @@ package com.dite.znpt.web.controller;
import com.dite.znpt.domain.PageResult;
import com.dite.znpt.domain.Result;
+import com.dite.znpt.domain.vo.ProjectBudgetInfoDetailResp;
+import com.dite.znpt.domain.vo.ProjectBudgetInfoImportReq;
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.service.ProjectBudgetInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -26,22 +26,35 @@ public class ProjectBudgetInfoController {
@Resource
private ProjectBudgetInfoService projectBudgetInfoService;
- @ApiOperation(value = "获取项目预算信息列表", httpMethod = "GET")
+ @ApiOperation(value = "筛选项目预算信息列表", httpMethod = "GET")
@GetMapping("/list")
- public PageResult list(ProjectBudgetInfoListReq projectBudgetInfoReq) {
- return PageResult.ok(projectBudgetInfoService.selectList(projectBudgetInfoReq));
+ public Result> list(ProjectBudgetInfoListReq projectBudgetInfoListReq) {
+ return Result.ok(projectBudgetInfoService.list(projectBudgetInfoListReq));
}
- @ApiOperation(value = "根据项目id获取项目预算信息列表", httpMethod = "GET")
- @GetMapping("/detail/{projectId}")
- public PageResult detailByProjectId(@PathVariable String projectId) {
- return PageResult.ok(projectBudgetInfoService.detailByProjectId(projectId));
+ @ApiOperation(value = "分页筛选项目预算信息列表", httpMethod = "GET")
+ @GetMapping("/page")
+ public PageResult page(ProjectBudgetInfoListReq projectBudgetInfoListReq) {
+ return PageResult.ok(projectBudgetInfoService.page(projectBudgetInfoListReq));
}
- @ApiOperation(value = "保存项目预算信息", httpMethod = "POST")
- @PostMapping
- public Result