shiyunteng
2025-04-27 c6db287f6c987060d615fd7ef5126511e051d5c6
盘点计划 盘点单
7个文件已修改
21个文件已添加
1073 ■■■■■ 已修改文件
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlan.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlanScope.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlanUser.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingRecord.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/DeviceClassVo.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/DeviceStocktakingPlanVo.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/StocktatingRecordVo.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DevicePurchasePlanController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DeviceStocktakingPlanController.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DeviceStocktakingRecordController.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceClassMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceInventoryMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanScopeMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanUserMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingRecordMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DevicePurchasePlanService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DeviceStocktakingPlanService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DeviceStocktakingRecordService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DevicePurchasePlanServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DeviceStocktakingPlanServiceImpl.java 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DeviceStocktakingRecordServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/resources/mapper/DeviceClassMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanMapper.xml 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanScopeMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanUserMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/resources/mapper/DeviceStocktakingRecordMapper.xml 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-biz/src/main/resources/mapper/deviceInventoryMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlan.java
New file
@@ -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;
}
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlanScope.java
New file
@@ -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;
}
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingPlanUser.java
New file
@@ -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;
}
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/DeviceStocktakingRecord.java
New file
@@ -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;
}
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/DeviceClassVo.java
New file
@@ -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;
}
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/DeviceStocktakingPlanVo.java
New file
@@ -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;
}
platformx-device-api/src/main/java/com/by4cloud/platformx/device/entity/vo/StocktatingRecordVo.java
New file
@@ -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;
}
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 表格
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DeviceStocktakingPlanController.java
New file
@@ -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);
    }
}
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/controller/DeviceStocktakingRecordController.java
New file
@@ -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));
    }
}
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);
}
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);
}
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanMapper.java
New file
@@ -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);
}
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanScopeMapper.java
New file
@@ -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> {
}
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingPlanUserMapper.java
New file
@@ -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> {
}
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/mapper/DeviceStocktakingRecordMapper.java
New file
@@ -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);
}
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);
}
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DeviceStocktakingPlanService.java
New file
@@ -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);
}
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/DeviceStocktakingRecordService.java
New file
@@ -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> {
}
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();
    }
}
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DeviceStocktakingPlanServiceImpl.java
New file
@@ -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 查询出所有末端分类ID并去重
//                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();
    }
}
platformx-device-biz/src/main/java/com/by4cloud/platformx/device/service/impl/DeviceStocktakingRecordServiceImpl.java
New file
@@ -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 {
}
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>
platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanMapper.xml
New file
@@ -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>
platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanScopeMapper.xml
New file
@@ -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>
platformx-device-biz/src/main/resources/mapper/DeviceStocktakingPlanUserMapper.xml
New file
@@ -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>
platformx-device-biz/src/main/resources/mapper/DeviceStocktakingRecordMapper.xml
New file
@@ -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>
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>