From c6db287f6c987060d615fd7ef5126511e051d5c6 Mon Sep 17 00:00:00 2001
From: shiyunteng <shiyunteng@example.com>
Date: 星期日, 27 四月 2025 17:33:30 +0800
Subject: [PATCH] 盘点计划 盘点单

---
 platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlanScope.java               |   29 +
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DevicePurchasePlanController.java         |   14 
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingRecordMapper.java            |   16 
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DeviceStocktakingPlanServiceImpl.java   |  179 +++++++++
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanUserMapper.java          |   11 
 platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanScopeMapper.xml                                   |   17 
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceClassMapper.java                        |    4 
 platformx-device-biz/src/main/resources/mapper/DeviceClassMapper.xml                                                  |   19 +
 platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlanUser.java                |   27 +
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DeviceStocktakingPlanService.java            |   22 +
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DeviceStocktakingPlanController.java      |  171 +++++++++
 platformx-device-biz/src/main/resources/mapper/DeviceStocktakingRecordMapper.xml                                      |   69 +++
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DeviceStocktakingRecordService.java          |    8 
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanMapper.java              |   14 
 platformx-device-biz/src/main/resources/mapper/deviceInventoryMapper.xml                                              |   16 
 platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlan.java                    |   53 ++
 platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/DeviceClassVo.java                         |   20 +
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DevicePurchasePlanService.java               |    3 
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanScopeMapper.java         |   11 
 platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/StocktatingRecordVo.java                   |   19 +
 platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/DeviceStocktakingPlanVo.java               |   36 ++
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DeviceStocktakingRecordController.java    |  119 ++++++
 platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingRecord.java                  |   91 +++++
 platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanMapper.xml                                        |   60 +++
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceInventoryMapper.java                    |    5 
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DevicePurchasePlanServiceImpl.java      |    7 
 platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DeviceStocktakingRecordServiceImpl.java |   16 
 platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanUserMapper.xml                                    |   17 
 28 files changed, 1,072 insertions(+), 1 deletions(-)

diff --git a/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlan.java b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlan.java
new file mode 100644
index 0000000..b70bf4b
--- /dev/null
+++ b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlan.java
@@ -0,0 +1,53 @@
+package com.by4cloud.platformx.device.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.by4cloud.platformx.common.data.mybatis.BaseModel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.hibernate.annotations.Table;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@Entity
+@TableName("device_stocktaking_plan")
+@javax.persistence.Table(name = "device_stocktaking_plan")
+@Table(appliesTo = "device_stocktaking_plan", comment = "璁惧鐩樼偣璁″垝")
+public class DeviceStocktakingPlan extends BaseModel<DeviceStocktakingPlan> {
+
+	@Schema(description = "璁″垝鍚嶇О")
+	@Column(columnDefinition="VARCHAR(128) comment '璁″垝鍚嶇О'")
+	private String planName;
+
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	@Schema(description = "鐩樼偣鍛ㄦ湡寮�濮�")
+	@Column(columnDefinition="VARCHAR(128) comment '鐩樼偣鍛ㄦ湡寮�濮�'")
+	private Date startDate;
+
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	@Schema(description = "鐩樼偣鍛ㄦ湡缁撴潫")
+	@Column(columnDefinition="VARCHAR(128) comment '鐩樼偣鍛ㄦ湡缁撴潫'")
+	private Date endDate;
+
+	@Schema(description = "鐩樼偣璁″垝鐘舵��")
+	@Column(columnDefinition="int comment '鐩樼偣璁″垝鐘舵�� 0 寰呭鎵�  1 寰呯敓鎴愮洏鐐瑰崟 2 鐩樼偣涓� 3 瀹屾垚'")
+	private Integer planStatus;
+
+	@Transient
+	@TableField(exist = false)
+	private List<Long> classIdList;
+
+	@Transient
+	@TableField(exist = false)
+	private List<Long> userIdList;
+
+	@Transient
+	@TableField(exist = false)
+	private String resultFlag;
+}
diff --git a/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlanScope.java b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlanScope.java
new file mode 100644
index 0000000..caaca79
--- /dev/null
+++ b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlanScope.java
@@ -0,0 +1,29 @@
+package com.by4cloud.platformx.device.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.by4cloud.platformx.common.data.mybatis.BaseModel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.hibernate.annotations.Table;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import java.util.Date;
+
+@Data
+@Entity
+@TableName("device_stocktaking_plan_scope")
+@javax.persistence.Table(name = "device_stocktaking_plan_scope")
+@Table(appliesTo = "device_stocktaking_plan_scope", comment = "璁惧鐩樼偣璁″垝鑼冨洿")
+public class DeviceStocktakingPlanScope extends BaseModel<DeviceStocktakingPlanScope> {
+
+	@Schema(description = "鍏宠仈鐩樼偣璁″垝")
+	@Column(columnDefinition="bigint comment '鍏宠仈鐩樼偣璁″垝'")
+	private Long planId;
+
+	@Schema(description = "鐩樼偣璁惧鍒嗙被ID")
+	@Column(columnDefinition="bigint comment '鐩樼偣璁惧鍒嗙被ID'")
+	private Long classId;
+
+}
diff --git a/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlanUser.java b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlanUser.java
new file mode 100644
index 0000000..c217891
--- /dev/null
+++ b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlanUser.java
@@ -0,0 +1,27 @@
+package com.by4cloud.platformx.device.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.by4cloud.platformx.common.data.mybatis.BaseModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.hibernate.annotations.Table;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+@Data
+@Entity
+@TableName("device_stocktaking_plan_user")
+@javax.persistence.Table(name = "device_stocktaking_plan_user")
+@Table(appliesTo = "device_stocktaking_plan_user", comment = "璁惧鐩樼偣璁″垝浜哄憳")
+public class DeviceStocktakingPlanUser extends BaseModel<DeviceStocktakingPlanUser> {
+
+	@Schema(description = "鍏宠仈鐩樼偣璁″垝")
+	@Column(columnDefinition="bigint comment '鍏宠仈鐩樼偣璁″垝'")
+	private Long planId;
+
+	@Schema(description = "鐩樼偣浜哄憳")
+	@Column(columnDefinition="bigint comment '鐩樼偣浜哄憳'")
+	private Long stocktakingUserId;
+
+}
diff --git a/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingRecord.java b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingRecord.java
new file mode 100644
index 0000000..3b790b3
--- /dev/null
+++ b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingRecord.java
@@ -0,0 +1,91 @@
+package com.by4cloud.platformx.device.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.by4cloud.platformx.common.data.mybatis.BaseModel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.hibernate.annotations.Table;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import java.util.Date;
+
+@Data
+@Entity
+@TableName("device_stocktaking_record")
+@javax.persistence.Table(name = "device_stocktaking_record")
+@Table(appliesTo = "device_stocktaking_record", comment = "璁惧鐩樼偣璁板綍")
+public class DeviceStocktakingRecord extends BaseModel<DeviceStocktakingRecord> {
+
+	@Schema(description = "鍏宠仈鐩樼偣璁″垝")
+	@Column(columnDefinition="bigint comment '鍏宠仈鐩樼偣璁″垝'")
+	private Long planId;
+
+	@Schema(description = "鐩樼偣璁惧鍒嗙被ID")
+	@Column(columnDefinition="bigint comment '鐩樼偣璁惧鍒嗙被ID'")
+	private Long classId;
+
+	/**
+	 * 璁惧ID
+	 */
+	@Schema(description="璁惧ID")
+	@Column(columnDefinition="bigint comment '璁惧ID'")
+	private Long deviceId;
+
+	/**
+	 * 璁惧ID
+	 */
+	@Schema(description="璁惧鍒嗙被ID")
+	@Column(columnDefinition="bigint comment '璁惧鍒嗙被ID'")
+	private Long deviceClassId;
+
+	/**
+	 * 璁惧缂栫爜
+	 */
+	@Schema(description="璁惧缂栫爜")
+	@Column(columnDefinition="VARCHAR(64) comment '璁惧缂栫爜'")
+	private String deviceCode;
+
+	/**
+	 * 璁惧鍚嶇О
+	 */
+	@Schema(description="璁惧鍚嶇О")
+	@Column(columnDefinition="VARCHAR(256) comment '璁惧鍚嶇О'")
+	private String deviceName;
+
+	/**
+	 * 瑙勬牸鍨嬪彿
+	 */
+	@Schema(description="瑙勬牸鍨嬪彿")
+	@Column(columnDefinition="VARCHAR(256) comment '瑙勬牸鍨嬪彿'")
+	private String deviceModels;
+
+	/**
+	 * 璁惧搴忓垪鍙�
+	 */
+	@Schema(description="璁惧搴忓垪鍙�")
+	@Column(columnDefinition="VARCHAR(256) comment '璁惧搴忓垪鍙�'")
+	private String serialNo;
+
+	@Schema(description = "寮傚父鏍囪")
+	@Column(columnDefinition="int comment '寮傚父鏍囪 0 鏃�  1 鐩樼泩 2 鐩樹簭 3 浣嶇疆鍋忕Щ'")
+	private Integer abnormalMarking;
+
+	@Schema(description = "瀛樻斁浣嶇疆")
+	@Column(columnDefinition="VARCHAR(256) comment '瀛樻斁浣嶇疆'")
+	private String position;
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+	@Schema(description = "鐩樼偣鏃堕棿")
+	@Column(columnDefinition="datetime comment '鐩樼偣鏃堕棿'")
+	private Date recordTime;
+
+	@Schema(description = "鐩樼偣浜哄憳")
+	@Column(columnDefinition="bigint comment '鐩樼偣浜哄憳'")
+	private Long stocktakingUserId;
+
+	@Schema(description = "杩囩▼鐓х墖")
+	@Column(columnDefinition="VARCHAR(256) comment '杩囩▼鐓х墖'")
+	private String recordPic;
+}
diff --git a/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/DeviceClassVo.java b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/DeviceClassVo.java
new file mode 100644
index 0000000..800e871
--- /dev/null
+++ b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/DeviceClassVo.java
@@ -0,0 +1,20 @@
+package com.by4cloud.platformx.device.entity.vo;
+
+import lombok.Data;
+
+@Data
+public class DeviceClassVo {
+
+	private Long classId;
+
+	private Long deviceId;
+
+	private String number;
+
+	private String name;
+
+	private String specification;
+
+	private String serialNo;
+
+}
diff --git a/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/DeviceStocktakingPlanVo.java b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/DeviceStocktakingPlanVo.java
new file mode 100644
index 0000000..b73f88a
--- /dev/null
+++ b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/DeviceStocktakingPlanVo.java
@@ -0,0 +1,36 @@
+package com.by4cloud.platformx.device.entity.vo;
+
+import com.by4cloud.platformx.device.entity.DeviceStocktakingRecord;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class DeviceStocktakingPlanVo {
+
+	private Long id;
+
+	@Schema(description = "璁″垝鍚嶇О")
+	private String planName;
+
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	@Schema(description = "鐩樼偣鍛ㄦ湡寮�濮�")
+	private Date startDate;
+
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	@Schema(description = "鐩樼偣鍛ㄦ湡缁撴潫")
+	private Date endDate;
+
+	private Integer planStatus;
+
+	private String scopes;
+
+	private List<Long> userIds;
+
+	private String users;
+
+	private List<DeviceStocktakingRecord> recordList;
+}
diff --git a/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/StocktatingRecordVo.java b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/StocktatingRecordVo.java
new file mode 100644
index 0000000..ecf1d79
--- /dev/null
+++ b/platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/StocktatingRecordVo.java
@@ -0,0 +1,19 @@
+package com.by4cloud.platformx.device.entity.vo;
+
+import lombok.Data;
+
+@Data
+public class StocktatingRecordVo {
+
+	private String number;
+
+	private String className;
+
+	private String specification;
+
+	private String deviceName;
+
+	private Integer zmNum;
+
+	private Integer pdNum;
+}
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DevicePurchasePlanController.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DevicePurchasePlanController.java
index b5136e5..84a7c58 100644
--- a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DevicePurchasePlanController.java
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DevicePurchasePlanController.java
@@ -46,7 +46,7 @@
     /**
      * 鍒嗛〉鏌ヨ
      * @param page 鍒嗛〉瀵硅薄
-     * @param devicePurchasePlan 璁惧閲囪喘璁″垝
+     * @param queryDTO 璁惧閲囪喘璁″垝
      * @return
      */
     @Operation(summary = "鍒嗛〉鏌ヨ" , description = "鍒嗛〉鏌ヨ" )
@@ -109,6 +109,18 @@
         return R.ok(devicePurchasePlanService.removeBatchByIds(CollUtil.toList(ids)));
     }
 
+	/**
+	 * 閫氳繃id鍒犻櫎璁惧閲囪喘璁″垝鏄庣粏
+	 * @param  id
+	 * @return R
+	 */
+	@Operation(summary = "閫氳繃id鍒犻櫎璁惧閲囪喘璁″垝鏄庣粏" , description = "閫氳繃id鍒犻櫎璁惧閲囪喘璁″垝鏄庣粏" )
+	@SysLog("閫氳繃id鍒犻櫎璁惧閲囪喘璁″垝鏄庣粏" )
+	@DeleteMapping("/removeItemById/{id}")
+	public R removeItemById(@PathVariable("id") Long id) {
+		return devicePurchasePlanService.removeItemById(id);
+	}
+
 
     /**
      * 瀵煎嚭excel 琛ㄦ牸
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DeviceStocktakingPlanController.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DeviceStocktakingPlanController.java
new file mode 100644
index 0000000..6b9a608
--- /dev/null
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DeviceStocktakingPlanController.java
@@ -0,0 +1,171 @@
+package com.by4cloud.platformx.device.controller;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.by4cloud.platformx.common.core.util.R;
+import com.by4cloud.platformx.common.log.annotation.SysLog;
+import com.by4cloud.platformx.device.entity.DeviceStocktakingPlan;
+import com.by4cloud.platformx.device.service.DeviceStocktakingPlanService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import com.by4cloud.platformx.common.excel.annotation.ResponseExcel;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import org.springdoc.api.annotations.ParameterObject;
+import org.springframework.http.HttpHeaders;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 璁惧鐩樼偣璁″垝
+ *
+ * @author syt
+ * @date 2025-04-24 15:19:13
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/deviceStocktakingPlan" )
+@Tag(description = "deviceStocktakingPlan" , name = "璁惧鐩樼偣璁″垝绠$悊" )
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class DeviceStocktakingPlanController {
+
+    private final  DeviceStocktakingPlanService deviceStocktakingPlanService;
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page 鍒嗛〉瀵硅薄
+     * @param deviceStocktakingPlan 璁惧鐩樼偣璁″垝
+     * @return
+     */
+    @Operation(summary = "鍒嗛〉鏌ヨ" , description = "鍒嗛〉鏌ヨ" )
+    @GetMapping("/page" )
+    @PreAuthorize("@pms.hasPermission('device_deviceStocktakingPlan_view')" )
+    public R getDeviceStocktakingPlanPage(@ParameterObject Page page, @ParameterObject DeviceStocktakingPlan deviceStocktakingPlan) {
+        LambdaQueryWrapper<DeviceStocktakingPlan> wrapper = Wrappers.lambdaQuery();
+		wrapper.eq(StrUtil.isNotBlank(deviceStocktakingPlan.getPlanName()), DeviceStocktakingPlan::getPlanName,deviceStocktakingPlan.getPlanName());
+		wrapper.eq(Objects.nonNull(deviceStocktakingPlan.getPlanStatus()),DeviceStocktakingPlan::getPlanStatus,deviceStocktakingPlan.getPlanStatus());
+		wrapper.eq(StrUtil.isNotBlank(deviceStocktakingPlan.getResultFlag())&&"1".equals(deviceStocktakingPlan.getResultFlag()),DeviceStocktakingPlan::getPlanStatus,2)
+				.or().eq(StrUtil.isNotBlank(deviceStocktakingPlan.getResultFlag())&&"1".equals(deviceStocktakingPlan.getResultFlag()),DeviceStocktakingPlan::getPlanStatus,3);
+		wrapper.orderByDesc(DeviceStocktakingPlan::getCreateTime);
+		return R.ok(deviceStocktakingPlanService.page(page, wrapper));
+    }
+
+
+    /**
+     * 閫氳繃id鏌ヨ璁惧鐩樼偣璁″垝
+     * @param id id
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鏌ヨ" , description = "閫氳繃id鏌ヨ" )
+    @GetMapping("/{id}" )
+    @PreAuthorize("@pms.hasPermission('device_deviceStocktakingPlan_view')" )
+    public R getById(@PathVariable("id" ) Long id) {
+        return deviceStocktakingPlanService.getByIdNew(id);
+    }
+
+    /**
+     * 鏂板璁惧鐩樼偣璁″垝
+     * @param deviceStocktakingPlan 璁惧鐩樼偣璁″垝
+     * @return R
+     */
+    @Operation(summary = "鏂板璁惧鐩樼偣璁″垝" , description = "鏂板璁惧鐩樼偣璁″垝" )
+    @SysLog("鏂板璁惧鐩樼偣璁″垝" )
+    @PostMapping
+    @PreAuthorize("@pms.hasPermission('device_deviceStocktakingPlan_add')" )
+    public R save(@RequestBody DeviceStocktakingPlan deviceStocktakingPlan) {
+        return deviceStocktakingPlanService.saveNew(deviceStocktakingPlan);
+    }
+
+    /**
+     * 淇敼璁惧鐩樼偣璁″垝
+     * @param deviceStocktakingPlan 璁惧鐩樼偣璁″垝
+     * @return R
+     */
+    @Operation(summary = "淇敼璁惧鐩樼偣璁″垝" , description = "淇敼璁惧鐩樼偣璁″垝" )
+    @SysLog("淇敼璁惧鐩樼偣璁″垝" )
+    @PutMapping
+    @PreAuthorize("@pms.hasPermission('device_deviceStocktakingPlan_edit')" )
+    public R updateById(@RequestBody DeviceStocktakingPlan deviceStocktakingPlan) {
+        return deviceStocktakingPlanService.updateByIdNew(deviceStocktakingPlan);
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎璁惧鐩樼偣璁″垝
+     * @param ids id鍒楄〃
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鍒犻櫎璁惧鐩樼偣璁″垝" , description = "閫氳繃id鍒犻櫎璁惧鐩樼偣璁″垝" )
+    @SysLog("閫氳繃id鍒犻櫎璁惧鐩樼偣璁″垝" )
+    @DeleteMapping
+    @PreAuthorize("@pms.hasPermission('device_deviceStocktakingPlan_del')" )
+    public R removeById(@RequestBody Long[] ids) {
+        return R.ok(deviceStocktakingPlanService.removeBatchByIds(CollUtil.toList(ids)));
+    }
+
+
+    /**
+     * 瀵煎嚭excel 琛ㄦ牸
+     * @param deviceStocktakingPlan 鏌ヨ鏉′欢
+   	 * @param ids 瀵煎嚭鎸囧畾ID
+     * @return excel 鏂囦欢娴�
+     */
+    @ResponseExcel
+    @GetMapping("/export")
+    @PreAuthorize("@pms.hasPermission('device_deviceStocktakingPlan_export')" )
+    public List<DeviceStocktakingPlan> export(DeviceStocktakingPlan deviceStocktakingPlan,Long[] ids) {
+        return deviceStocktakingPlanService.list(Wrappers.lambdaQuery(deviceStocktakingPlan).in(ArrayUtil.isNotEmpty(ids), DeviceStocktakingPlan::getId, ids));
+    }
+
+	/**
+	 * 閫氳繃id瀹℃牳閫氳繃璁惧鐩樼偣璁″垝
+	 * @param id id
+	 * @return R
+	 */
+	@Operation(summary = "閫氳繃id瀹℃牳閫氳繃璁惧鐩樼偣璁″垝" , description = "閫氳繃id瀹℃牳閫氳繃璁惧鐩樼偣璁″垝" )
+	@GetMapping("/approved/{id}" )
+	@PreAuthorize("@pms.hasPermission('device_deviceStocktakingPlan_approved')" )
+	public R approved(@PathVariable("id" ) Long id) {
+		return deviceStocktakingPlanService.approved(id);
+	}
+
+	/**
+	 * 閫氳繃鐩樼偣璁″垝id鐢熸垚鐩樼偣鍗�
+	 * @param id id
+	 * @return R
+	 */
+	@Operation(summary = "閫氳繃鐩樼偣璁″垝id鐢熸垚鐩樼偣鍗�" , description = "閫氳繃鐩樼偣璁″垝id鐢熸垚鐩樼偣鍗�" )
+	@GetMapping("/genRecord/{id}" )
+	@PreAuthorize("@pms.hasPermission('device_deviceStocktakingPlan_genrecord')" )
+	public R genRecord(@PathVariable("id" ) Long id) {
+		return deviceStocktakingPlanService.genRecord(id);
+	}
+
+	/**
+	 * 閫氳繃鐩樼偣璁″垝id鑾峰彇鐩樼偣缁撴灉
+	 * @param id id
+	 * @return R
+	 */
+	@Operation(summary = "閫氳繃鐩樼偣璁″垝id鑾峰彇鐩樼偣缁撴灉" , description = "閫氳繃鐩樼偣璁″垝id鑾峰彇鐩樼偣缁撴灉" )
+	@GetMapping("/getResult/{id}" )
+	public R getResult(@PathVariable("id" ) Long id) {
+		return deviceStocktakingPlanService.getResult(id);
+	}
+
+	/**
+	 * 閫氳繃鐩樼偣璁″垝id瀹屾垚鐩樼偣缁撴灉
+	 * @param id id
+	 * @return R
+	 */
+	@Operation(summary = "閫氳繃鐩樼偣璁″垝id瀹屾垚鐩樼偣缁撴灉" , description = "閫氳繃鐩樼偣璁″垝id瀹屾垚鐩樼偣缁撴灉" )
+	@GetMapping("/complete/{id}" )
+	public R complete(@PathVariable("id" ) Long id) {
+		return deviceStocktakingPlanService.complete(id);
+	}
+}
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DeviceStocktakingRecordController.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DeviceStocktakingRecordController.java
new file mode 100644
index 0000000..4e3b0bc
--- /dev/null
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DeviceStocktakingRecordController.java
@@ -0,0 +1,119 @@
+package com.by4cloud.platformx.device.controller;
+
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.by4cloud.platformx.common.core.util.R;
+import com.by4cloud.platformx.common.log.annotation.SysLog;
+import com.by4cloud.platformx.device.entity.DeviceStocktakingRecord;
+import com.by4cloud.platformx.device.service.DeviceStocktakingRecordService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import com.by4cloud.platformx.common.excel.annotation.ResponseExcel;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import org.springdoc.api.annotations.ParameterObject;
+import org.springframework.http.HttpHeaders;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 璁惧鐩樼偣璁板綍
+ *
+ * @author syt
+ * @date 2025-04-24 15:21:08
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/deviceStocktakingRecord" )
+@Tag(description = "deviceStocktakingRecord" , name = "璁惧鐩樼偣璁板綍绠$悊" )
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class DeviceStocktakingRecordController {
+
+    private final  DeviceStocktakingRecordService deviceStocktakingRecordService;
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page 鍒嗛〉瀵硅薄
+     * @param deviceStocktakingRecord 璁惧鐩樼偣璁板綍
+     * @return
+     */
+    @Operation(summary = "鍒嗛〉鏌ヨ" , description = "鍒嗛〉鏌ヨ" )
+    @GetMapping("/page" )
+    @PreAuthorize("@pms.hasPermission('device_deviceStocktakingRecord_view')" )
+    public R getDeviceStocktakingRecordPage(@ParameterObject Page page, @ParameterObject DeviceStocktakingRecord deviceStocktakingRecord) {
+        LambdaQueryWrapper<DeviceStocktakingRecord> wrapper = Wrappers.lambdaQuery();
+        return R.ok(deviceStocktakingRecordService.page(page, wrapper));
+    }
+
+
+    /**
+     * 閫氳繃id鏌ヨ璁惧鐩樼偣璁板綍
+     * @param id id
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鏌ヨ" , description = "閫氳繃id鏌ヨ" )
+    @GetMapping("/{id}" )
+    @PreAuthorize("@pms.hasPermission('device_deviceStocktakingRecord_view')" )
+    public R getById(@PathVariable("id" ) Long id) {
+        return R.ok(deviceStocktakingRecordService.getById(id));
+    }
+
+    /**
+     * 鏂板璁惧鐩樼偣璁板綍
+     * @param deviceStocktakingRecord 璁惧鐩樼偣璁板綍
+     * @return R
+     */
+    @Operation(summary = "鏂板璁惧鐩樼偣璁板綍" , description = "鏂板璁惧鐩樼偣璁板綍" )
+    @SysLog("鏂板璁惧鐩樼偣璁板綍" )
+    @PostMapping
+    @PreAuthorize("@pms.hasPermission('device_deviceStocktakingRecord_add')" )
+    public R save(@RequestBody DeviceStocktakingRecord deviceStocktakingRecord) {
+        return R.ok(deviceStocktakingRecordService.save(deviceStocktakingRecord));
+    }
+
+    /**
+     * 淇敼璁惧鐩樼偣璁板綍
+     * @param deviceStocktakingRecord 璁惧鐩樼偣璁板綍
+     * @return R
+     */
+    @Operation(summary = "淇敼璁惧鐩樼偣璁板綍" , description = "淇敼璁惧鐩樼偣璁板綍" )
+    @SysLog("淇敼璁惧鐩樼偣璁板綍" )
+    @PutMapping
+    @PreAuthorize("@pms.hasPermission('device_deviceStocktakingRecord_edit')" )
+    public R updateById(@RequestBody DeviceStocktakingRecord deviceStocktakingRecord) {
+        return R.ok(deviceStocktakingRecordService.updateById(deviceStocktakingRecord));
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎璁惧鐩樼偣璁板綍
+     * @param ids id鍒楄〃
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鍒犻櫎璁惧鐩樼偣璁板綍" , description = "閫氳繃id鍒犻櫎璁惧鐩樼偣璁板綍" )
+    @SysLog("閫氳繃id鍒犻櫎璁惧鐩樼偣璁板綍" )
+    @DeleteMapping
+    @PreAuthorize("@pms.hasPermission('device_deviceStocktakingRecord_del')" )
+    public R removeById(@RequestBody Long[] ids) {
+        return R.ok(deviceStocktakingRecordService.removeBatchByIds(CollUtil.toList(ids)));
+    }
+
+
+    /**
+     * 瀵煎嚭excel 琛ㄦ牸
+     * @param deviceStocktakingRecord 鏌ヨ鏉′欢
+   	 * @param ids 瀵煎嚭鎸囧畾ID
+     * @return excel 鏂囦欢娴�
+     */
+    @ResponseExcel
+    @GetMapping("/export")
+    @PreAuthorize("@pms.hasPermission('device_deviceStocktakingRecord_export')" )
+    public List<DeviceStocktakingRecord> export(DeviceStocktakingRecord deviceStocktakingRecord,Long[] ids) {
+        return deviceStocktakingRecordService.list(Wrappers.lambdaQuery(deviceStocktakingRecord).in(ArrayUtil.isNotEmpty(ids), DeviceStocktakingRecord::getId, ids));
+    }
+}
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceClassMapper.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceClassMapper.java
index bdcb528..1ba8c67 100644
--- a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceClassMapper.java
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceClassMapper.java
@@ -3,9 +3,13 @@
 import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
 import com.by4cloud.platformx.device.entity.DeviceClass;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 @Mapper
 public interface DeviceClassMapper extends PlatformxBaseMapper<DeviceClass> {
 
 
+    List<Long> selectEndNode(@Param("classId") Long classId);
 }
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceInventoryMapper.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceInventoryMapper.java
index 0db9e94..19e73cd 100644
--- a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceInventoryMapper.java
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceInventoryMapper.java
@@ -2,13 +2,18 @@
 
 import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
 import com.by4cloud.platformx.device.entity.DeviceInventory;
+import com.by4cloud.platformx.device.entity.vo.DeviceClassVo;
 import com.by4cloud.platformx.device.entity.vo.InventoryDetailVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 @Mapper
 public interface DeviceInventoryMapper extends PlatformxBaseMapper<DeviceInventory> {
 
 
     InventoryDetailVo getReleaseDetail(@Param("id") Long id);
+
+    List<DeviceClassVo> selectListByClassId(@Param("classId") Long classId);
 }
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanMapper.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanMapper.java
new file mode 100644
index 0000000..b611810
--- /dev/null
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanMapper.java
@@ -0,0 +1,14 @@
+package com.by4cloud.platformx.device.mapper;
+
+import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
+import com.by4cloud.platformx.device.entity.DeviceStocktakingPlan;
+import com.by4cloud.platformx.device.entity.vo.DeviceStocktakingPlanVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface DeviceStocktakingPlanMapper extends PlatformxBaseMapper<DeviceStocktakingPlan> {
+
+
+    DeviceStocktakingPlanVo selectVoById(@Param("id") Long id);
+}
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanScopeMapper.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanScopeMapper.java
new file mode 100644
index 0000000..08271dc
--- /dev/null
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanScopeMapper.java
@@ -0,0 +1,11 @@
+package com.by4cloud.platformx.device.mapper;
+
+import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
+import com.by4cloud.platformx.device.entity.DeviceStocktakingPlanScope;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DeviceStocktakingPlanScopeMapper extends PlatformxBaseMapper<DeviceStocktakingPlanScope> {
+
+
+}
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanUserMapper.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanUserMapper.java
new file mode 100644
index 0000000..d7c4aed
--- /dev/null
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanUserMapper.java
@@ -0,0 +1,11 @@
+package com.by4cloud.platformx.device.mapper;
+
+import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
+import com.by4cloud.platformx.device.entity.DeviceStocktakingPlanUser;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DeviceStocktakingPlanUserMapper extends PlatformxBaseMapper<DeviceStocktakingPlanUser> {
+
+
+}
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingRecordMapper.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingRecordMapper.java
new file mode 100644
index 0000000..c9f978e
--- /dev/null
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingRecordMapper.java
@@ -0,0 +1,16 @@
+package com.by4cloud.platformx.device.mapper;
+
+import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
+import com.by4cloud.platformx.device.entity.DeviceStocktakingRecord;
+import com.by4cloud.platformx.device.entity.vo.StocktatingRecordVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface DeviceStocktakingRecordMapper extends PlatformxBaseMapper<DeviceStocktakingRecord> {
+
+
+    List<StocktatingRecordVo> selectStocktatingResultByPlanId(@Param("id") Long id);
+}
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DevicePurchasePlanService.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DevicePurchasePlanService.java
index 2176343..4160720 100644
--- a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DevicePurchasePlanService.java
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DevicePurchasePlanService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.by4cloud.platformx.common.core.util.R;
 import com.by4cloud.platformx.device.dto.DevicePurchasePlanQueryDTO;
 import com.by4cloud.platformx.device.entity.DevicePurchasePlan;
 
@@ -17,4 +18,6 @@
 	DevicePurchasePlan getByIdNew(Long id);
 
 	boolean updateByIdNew(DevicePurchasePlan devicePurchasePlan);
+
+	R removeItemById(Long id);
 }
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DeviceStocktakingPlanService.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DeviceStocktakingPlanService.java
new file mode 100644
index 0000000..d43b236
--- /dev/null
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DeviceStocktakingPlanService.java
@@ -0,0 +1,22 @@
+package com.by4cloud.platformx.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.by4cloud.platformx.common.core.util.R;
+import com.by4cloud.platformx.device.entity.DeviceStocktakingPlan;
+
+public interface DeviceStocktakingPlanService extends IService<DeviceStocktakingPlan> {
+
+	R saveNew(DeviceStocktakingPlan deviceStocktakingPlan);
+
+	R approved(Long id);
+
+	R genRecord(Long id);
+
+	R getResult(Long id);
+
+	R getByIdNew(Long id);
+
+	R complete(Long id);
+
+	R updateByIdNew(DeviceStocktakingPlan deviceStocktakingPlan);
+}
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DeviceStocktakingRecordService.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DeviceStocktakingRecordService.java
new file mode 100644
index 0000000..87c3612
--- /dev/null
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DeviceStocktakingRecordService.java
@@ -0,0 +1,8 @@
+package com.by4cloud.platformx.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.by4cloud.platformx.device.entity.DeviceStocktakingRecord;
+
+public interface DeviceStocktakingRecordService extends IService<DeviceStocktakingRecord> {
+
+}
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DevicePurchasePlanServiceImpl.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DevicePurchasePlanServiceImpl.java
index fd7a9c6..6a07206 100644
--- a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DevicePurchasePlanServiceImpl.java
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DevicePurchasePlanServiceImpl.java
@@ -4,6 +4,7 @@
 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.by4cloud.platformx.common.core.util.R;
 import com.by4cloud.platformx.common.security.util.SecurityUtils;
 import com.by4cloud.platformx.device.constant.CommonStatusContant;
 import com.by4cloud.platformx.device.constant.MaxSizeContant;
@@ -89,4 +90,10 @@
 		}
 		return true;
 	}
+
+	@Override
+	public R removeItemById(Long id) {
+		itemMapper.deleteById(id);
+		return R.ok();
+	}
 }
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DeviceStocktakingPlanServiceImpl.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DeviceStocktakingPlanServiceImpl.java
new file mode 100644
index 0000000..bdbcc64
--- /dev/null
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DeviceStocktakingPlanServiceImpl.java
@@ -0,0 +1,179 @@
+package com.by4cloud.platformx.device.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.by4cloud.platformx.common.core.util.R;
+import com.by4cloud.platformx.device.constant.CommonStatusContant;
+import com.by4cloud.platformx.device.entity.*;
+import com.by4cloud.platformx.device.entity.vo.DeviceClassVo;
+import com.by4cloud.platformx.device.entity.vo.DeviceStocktakingPlanVo;
+import com.by4cloud.platformx.device.entity.vo.StocktatingRecordVo;
+import com.by4cloud.platformx.device.mapper.*;
+import com.by4cloud.platformx.device.service.DeviceStocktakingPlanService;
+import lombok.AllArgsConstructor;
+
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+/**
+ * 璁惧鐩樼偣璁″垝
+ *
+ * @author syt
+ * @date 2025-04-24 15:19:13
+ */
+@Service
+@AllArgsConstructor
+public class DeviceStocktakingPlanServiceImpl extends ServiceImpl<DeviceStocktakingPlanMapper, DeviceStocktakingPlan> implements DeviceStocktakingPlanService {
+
+	private final DeviceStocktakingPlanScopeMapper scopeMapper;
+	private final DeviceStocktakingPlanUserMapper userMapper;
+	private final DeviceInventoryMapper inventoryMapper;
+	private final DeviceStocktakingRecordMapper recordMapper;
+
+	@Override
+	public R saveNew(DeviceStocktakingPlan deviceStocktakingPlan) {
+		deviceStocktakingPlan.setPlanStatus(CommonStatusContant.DEVICE_STOCKTAKING_STATUS_APPROVED);
+		baseMapper.insert(deviceStocktakingPlan);
+		//鏂板鐩樼偣浜哄憳
+		if (deviceStocktakingPlan.getUserIdList().size()>0){
+			deviceStocktakingPlan.getUserIdList().stream().forEach(userId->{
+				DeviceStocktakingPlanUser planUser = new DeviceStocktakingPlanUser();
+				planUser.setPlanId(deviceStocktakingPlan.getId());
+				planUser.setStocktakingUserId(userId);
+				userMapper.insert(planUser);
+			});
+		}
+		//鏂板鍒ゆ柇鑼冨洿
+		if (deviceStocktakingPlan.getClassIdList().size()>0){
+//			List<Long> classArr = new ArrayList<>();
+//			for (Long classId:deviceStocktakingPlan.getClassIdList()
+//				 ) {
+//				List<Long> classes = classMapper.selectEndNode(classId);
+//				//鏍规嵁鍒嗙被iD 鏌ヨ鍑烘墍鏈夋湯绔垎绫籌D骞跺幓閲�
+//				classArr = ListUtils.union(classArr,classes).stream().distinct().collect(Collectors.toList());
+//			}
+//			if (classArr.size()>0){
+//				classArr.stream().forEach(classId->{
+//					DeviceStocktakingPlanScope planScope = new DeviceStocktakingPlanScope();
+//					planScope.setPlanId(deviceStocktakingPlan.getId());
+//					planScope.setClassId(classId);
+//					scopeMapper.insert(planScope);
+//				});
+//			}
+			deviceStocktakingPlan.getClassIdList().stream().forEach(classId->{
+				DeviceStocktakingPlanScope planScope = new DeviceStocktakingPlanScope();
+				planScope.setPlanId(deviceStocktakingPlan.getId());
+				planScope.setClassId(classId);
+				scopeMapper.insert(planScope);
+			});
+
+		}
+		return R.ok();
+	}
+
+	@Override
+	public R approved(Long id) {
+		DeviceStocktakingPlan plan = baseMapper.selectById(id);
+		plan.setPlanStatus(CommonStatusContant.DEVICE_STOCKTAKING_STATUS_GEN);
+		baseMapper.updateById(plan);
+		return R.ok();
+	}
+
+	@Override
+	public R genRecord(Long id) {
+		QueryWrapper<DeviceStocktakingPlanScope> queryMapper = new QueryWrapper<>();
+		queryMapper.eq("plan_id",id);
+		List<DeviceStocktakingPlanScope> scopeList = scopeMapper.selectList(queryMapper);
+		if (scopeList.size()>0){
+			scopeList.stream().forEach(scopeItem->{
+				List<DeviceClassVo> deviceClassVos = inventoryMapper.selectListByClassId(scopeItem.getClassId());
+				if (deviceClassVos.size()>0) {
+					deviceClassVos.stream().forEach(vo->{
+						DeviceStocktakingRecord record = new DeviceStocktakingRecord();
+						record.setPlanId(id);
+						record.setClassId(vo.getClassId());
+						record.setDeviceClassId(vo.getClassId());
+						record.setDeviceId(vo.getDeviceId());
+						record.setDeviceName(vo.getName());
+						record.setDeviceCode(vo.getNumber());
+						record.setDeviceModels(vo.getSpecification());
+						record.setSerialNo(vo.getSerialNo());
+						recordMapper.insert(record);
+					});
+				}
+			});
+		}
+		//鏇存柊璁″垝鐘舵��
+		DeviceStocktakingPlan plan = baseMapper.selectById(id);
+		plan.setPlanStatus(CommonStatusContant.DEVICE_STOCKTAKING_STATUS_STOCKTATING);
+		baseMapper.updateById(plan);
+		return R.ok();
+	}
+
+	@Override
+	public R getResult(Long id) {
+		List<StocktatingRecordVo> recordVoList = recordMapper.selectStocktatingResultByPlanId(id);
+		return R.ok(recordVoList);
+	}
+
+	@Override
+	public R getByIdNew(Long id) {
+		DeviceStocktakingPlanVo vo = baseMapper.selectVoById(id);
+		if (vo!=null){
+			QueryWrapper<DeviceStocktakingRecord> queryWrapper = new QueryWrapper<>();
+			queryWrapper.eq("plan_id",id);
+			List<DeviceStocktakingRecord> recordList = recordMapper.selectList(queryWrapper);
+			vo.setRecordList(recordList);
+			QueryWrapper<DeviceStocktakingPlanUser> userQueryWrapper = new QueryWrapper<>();
+			userQueryWrapper.eq("plan_id",id);
+			List<DeviceStocktakingPlanUser> userList = userMapper.selectList(userQueryWrapper);
+			if (userList.size()>0) {
+				List<Long> userIds = userList.stream().map(DeviceStocktakingPlanUser::getStocktakingUserId).collect(Collectors.toList());
+				vo.setUserIds(userIds);
+			}
+		}
+		return R.ok(vo);
+	}
+
+	@Override
+	public R complete(Long id) {
+		DeviceStocktakingPlan plan = baseMapper.selectById(id);
+		plan.setPlanStatus(CommonStatusContant.DEVICE_STOCKTAKING_STATUS_COMPLETE);
+		baseMapper.updateById(plan);
+		return R.ok();
+	}
+
+	@Override
+	public R updateByIdNew(DeviceStocktakingPlan deviceStocktakingPlan) {
+		baseMapper.updateById(deviceStocktakingPlan);
+		//鏂板鐩樼偣浜哄憳
+		if (deviceStocktakingPlan.getUserIdList().size()>0){
+			QueryWrapper<DeviceStocktakingPlanUser> userQueryWrapper = new QueryWrapper<>();
+			userQueryWrapper.eq("plan_id",deviceStocktakingPlan.getId());
+			userMapper.delete(userQueryWrapper);
+			deviceStocktakingPlan.getUserIdList().stream().forEach(userId->{
+				DeviceStocktakingPlanUser planUser = new DeviceStocktakingPlanUser();
+				planUser.setPlanId(deviceStocktakingPlan.getId());
+				planUser.setStocktakingUserId(userId);
+				userMapper.insert(planUser);
+			});
+		}
+		//鏂板鍒ゆ柇鑼冨洿
+		if (deviceStocktakingPlan.getClassIdList().size()>0){
+			QueryWrapper<DeviceStocktakingPlanScope> scopeQueryWrapper = new QueryWrapper<>();
+			scopeQueryWrapper.eq("plan_id",deviceStocktakingPlan.getId());
+			scopeMapper.delete(scopeQueryWrapper);
+			deviceStocktakingPlan.getClassIdList().stream().forEach(classId->{
+				DeviceStocktakingPlanScope planScope = new DeviceStocktakingPlanScope();
+				planScope.setPlanId(deviceStocktakingPlan.getId());
+				planScope.setClassId(classId);
+				scopeMapper.insert(planScope);
+			});
+
+		}
+		return R.ok();
+	}
+}
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DeviceStocktakingRecordServiceImpl.java b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DeviceStocktakingRecordServiceImpl.java
new file mode 100644
index 0000000..5236cf8
--- /dev/null
+++ b/platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DeviceStocktakingRecordServiceImpl.java
@@ -0,0 +1,16 @@
+package com.by4cloud.platformx.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.by4cloud.platformx.device.entity.DeviceStocktakingRecord;
+import com.by4cloud.platformx.device.mapper.DeviceStocktakingRecordMapper;
+import com.by4cloud.platformx.device.service.DeviceStocktakingRecordService;
+import org.springframework.stereotype.Service;
+/**
+ * 璁惧鐩樼偣璁板綍
+ *
+ * @author syt
+ * @date 2025-04-24 15:21:08
+ */
+@Service
+public class DeviceStocktakingRecordServiceImpl extends ServiceImpl<DeviceStocktakingRecordMapper, DeviceStocktakingRecord> implements DeviceStocktakingRecordService {
+}
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/resources/mapper/DeviceClassMapper.xml b/platformx-device-biz/src/main/resources/mapper/DeviceClassMapper.xml
index 0d83cf6..bc6fea9 100644
--- a/platformx-device-biz/src/main/resources/mapper/DeviceClassMapper.xml
+++ b/platformx-device-biz/src/main/resources/mapper/DeviceClassMapper.xml
@@ -18,4 +18,23 @@
         <result property="updateTime" column="update_time"/>
         <result property="delFlag" column="del_flag"/>
   </resultMap>
+    <select id="selectEndNode" resultType="java.lang.Long">
+		SELECT parent.id
+		FROM (
+				 SELECT t1.*
+				 FROM device_class t1
+				 WHERE FIND_IN_SET(t1.id, (
+					 SELECT GROUP_CONCAT(id)
+					 FROM (
+							  SELECT id, IF(FIND_IN_SET(p_id, @pids) > 0, @pids := CONCAT(@pids, ',', id), 0) AS is_child
+							  FROM device_class, (SELECT @pids := #{classId}) tmp
+							  ORDER BY p_id
+						  ) t
+					 WHERE is_child != 0
+					 )) OR t1.id = #{classId}
+			 ) parent
+				 LEFT JOIN device_class child ON parent.id = child.p_id
+		WHERE child.id IS NULL;  -- 楠岃瘉鏄惁涓烘湯绔妭鐐�
+
+	</select>
 </mapper>
diff --git a/platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanMapper.xml b/platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanMapper.xml
new file mode 100644
index 0000000..6aca0e6
--- /dev/null
+++ b/platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanMapper.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.by4cloud.platformx.device.mapper.DeviceStocktakingPlanMapper">
+
+  <resultMap id="deviceStocktakingPlanMap" type="com.by4cloud.platformx.device.entity.DeviceStocktakingPlan">
+        <id property="id" column="id"/>
+        <result property="compId" column="comp_id"/>
+        <result property="endDate" column="end_date"/>
+        <result property="planName" column="plan_name"/>
+        <result property="planStatus" column="plan_status"/>
+        <result property="startDate" column="start_date"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="delFlag" column="del_flag"/>
+  </resultMap>
+    <select id="selectVoById" resultType="com.by4cloud.platformx.device.entity.vo.DeviceStocktakingPlanVo">
+
+		select
+			dsp.id,
+		    dsp.plan_name,
+			dsp.start_date,
+			dsp.end_date,
+		    dsp.plan_status,
+			(
+				select
+					GROUP_CONCAT(name)
+				from
+					platformxx_boot.sys_user su
+				where
+					exists (
+							select
+								*
+							from
+								device_stocktaking_plan_user dspu
+							where
+								dspu.stocktaking_user_id = su.user_id
+							  and dspu.plan_id = dsp.id)) users,
+			(
+				select
+					GROUP_CONCAT(name)
+				from
+					device_class dc
+				where
+					exists (
+							select
+								*
+							from
+								device_stocktaking_plan_scope dsps
+							where
+								dsps.class_id = dc.id
+							  and dsps.plan_id = dsp.id)) scopes
+		from
+			device_stocktaking_plan dsp
+		where
+			dsp.id = #{id}
+	</select>
+</mapper>
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanScopeMapper.xml b/platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanScopeMapper.xml
new file mode 100644
index 0000000..64fef8a
--- /dev/null
+++ b/platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanScopeMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.by4cloud.platformx.device.mapper.DeviceStocktakingPlanScopeMapper">
+
+	<resultMap id="deviceStocktakingPlanScopeMap" type="com.by4cloud.platformx.device.entity.DeviceStocktakingPlanScope">
+		<id property="id" column="id"/>
+		<result property="compId" column="comp_id"/>
+		<result property="classId" column="class_id"/>
+		<result property="planId" column="plan_id"/>
+		<result property="createBy" column="create_by"/>
+		<result property="createTime" column="create_time"/>
+		<result property="updateBy" column="update_by"/>
+		<result property="updateTime" column="update_time"/>
+		<result property="delFlag" column="del_flag"/>
+	</resultMap>
+</mapper>
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanUserMapper.xml b/platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanUserMapper.xml
new file mode 100644
index 0000000..9709832
--- /dev/null
+++ b/platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanUserMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.by4cloud.platformx.device.mapper.DeviceStocktakingPlanUserMapper">
+
+	<resultMap id="deviceStocktakingPlanUserMap" type="com.by4cloud.platformx.device.entity.DeviceStocktakingPlanUser">
+		<id property="id" column="id"/>
+		<result property="compId" column="comp_id"/>
+		<result property="planId" column="plan_id"/>
+		<result property="stocktakingUserId" column="stocktaking_user_id"/>
+		<result property="createBy" column="create_by"/>
+		<result property="createTime" column="create_time"/>
+		<result property="updateBy" column="update_by"/>
+		<result property="updateTime" column="update_time"/>
+		<result property="delFlag" column="del_flag"/>
+	</resultMap>
+</mapper>
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/resources/mapper/DeviceStocktakingRecordMapper.xml b/platformx-device-biz/src/main/resources/mapper/DeviceStocktakingRecordMapper.xml
new file mode 100644
index 0000000..4c096ad
--- /dev/null
+++ b/platformx-device-biz/src/main/resources/mapper/DeviceStocktakingRecordMapper.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.by4cloud.platformx.device.mapper.DeviceStocktakingRecordMapper">
+
+  <resultMap id="deviceStocktakingRecordMap" type="com.by4cloud.platformx.device.entity.DeviceStocktakingRecord">
+        <id property="id" column="id"/>
+        <result property="compId" column="comp_id"/>
+        <result property="classId" column="class_id"/>
+        <result property="deviceClassId" column="device_class_id"/>
+        <result property="deviceCode" column="device_code"/>
+        <result property="deviceId" column="device_id"/>
+        <result property="deviceModels" column="device_models"/>
+        <result property="deviceName" column="device_name"/>
+        <result property="planId" column="plan_id"/>
+        <result property="position" column="position"/>
+        <result property="recordPic" column="record_pic"/>
+        <result property="recordTime" column="record_time"/>
+        <result property="serialNo" column="serial_no"/>
+        <result property="stocktakingUserId" column="stocktaking_user_id"/>
+        <result property="abnormalMarking" column="abnormal_marking"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="delFlag" column="del_flag"/>
+  </resultMap>
+    <select id="selectStocktatingResultByPlanId"
+            resultType="com.by4cloud.platformx.device.entity.vo.StocktatingRecordVo">
+		select
+			d.class_id ,
+			dc.name className,
+			d.number ,
+			d.name deviceName,
+			d.specification,
+			count(serial_no) zmNum,
+			(
+				select
+					count(1)
+				from
+					device_stocktaking_record dsr
+				where
+					dsr.class_id = d.class_id
+				  and dsr.abnormal_marking = 0) pdNum
+		from
+			device_inventory di
+				join device d on
+				d.id = di.device_id
+				join device_class dc on
+				d.class_id = dc.id
+		where
+			di.del_flag = '0'
+		  and exists (
+				select
+					*
+				from
+					device_stocktaking_plan_scope dsps
+				where
+					dsps.class_id = d.class_id
+		      	and dsps.plan_id = #{id}
+			)
+		group by
+			d.class_id ,
+			dc.name ,
+			d.number ,
+			d.name,
+			d.specification
+	</select>
+</mapper>
\ No newline at end of file
diff --git a/platformx-device-biz/src/main/resources/mapper/deviceInventoryMapper.xml b/platformx-device-biz/src/main/resources/mapper/deviceInventoryMapper.xml
index 8c9400d..6c4477f 100644
--- a/platformx-device-biz/src/main/resources/mapper/deviceInventoryMapper.xml
+++ b/platformx-device-biz/src/main/resources/mapper/deviceInventoryMapper.xml
@@ -39,4 +39,20 @@
 		where
 			di.id =#{id}
 	</select>
+    <select id="selectListByClassId" resultType="com.by4cloud.platformx.device.entity.vo.DeviceClassVo">
+		select
+		    di.device_id ,
+			d.class_id ,
+			d.number ,
+			d.name,
+			d.specification,
+			di.serial_no
+		from
+			device_inventory di
+				join device d on
+				d.id = di.device_id
+		where
+			di.del_flag = '0'
+		  and d.class_id = #{classId}
+	</select>
 </mapper>

--
Gitblit v1.9.1