Browse Source

新增设备盘点模块

lingpeng.li 3 months ago
parent
commit
38c5ef38bb
19 changed files with 1693 additions and 0 deletions
  1. 437 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/controller/InventoryPlanController.java
  2. 50 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/dto/InventoryPlanQueryDTO.java
  3. 170 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/entity/InventoryList.java
  4. 147 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/entity/InventoryPlan.java
  5. 215 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/entity/InventoryTask.java
  6. 31 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/mapper/InventoryListMapper.java
  7. 14 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/mapper/InventoryPlanMapper.java
  8. 31 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/mapper/InventoryTaskMapper.java
  9. 16 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/mapper/xml/InventoryListMapper.xml
  10. 5 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/mapper/xml/InventoryPlanMapper.xml
  11. 16 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/mapper/xml/InventoryTaskMapper.xml
  12. 26 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/service/IInventoryListService.java
  13. 51 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/service/IInventoryPlanService.java
  14. 26 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/service/IInventoryTaskService.java
  15. 65 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/service/impl/InventoryListServiceImpl.java
  16. 121 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/service/impl/InventoryPlanServiceImpl.java
  17. 75 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/service/impl/InventoryTaskServiceImpl.java
  18. 152 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/vo/InventoryPlanPage.java
  19. 45 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/vo/InventoryProgressVO.java

+ 437 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/controller/InventoryPlanController.java

@@ -0,0 +1,437 @@
+package org.jeecg.modules.equipmentInventory.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.jeecg.common.api.CommonAPI;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.RedisUtil;
+import org.jeecg.common.util.TokenUtils;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.equipmentInventory.dto.InventoryPlanQueryDTO;
+import org.jeecg.modules.equipmentInventory.entity.InventoryList;
+import org.jeecg.modules.equipmentInventory.entity.InventoryPlan;
+import org.jeecg.modules.equipmentInventory.entity.InventoryTask;
+import org.jeecg.modules.equipmentInventory.service.IInventoryListService;
+import org.jeecg.modules.equipmentInventory.service.IInventoryPlanService;
+import org.jeecg.modules.equipmentInventory.service.IInventoryTaskService;
+import org.jeecg.modules.equipmentInventory.vo.InventoryPlanPage;
+import org.jeecg.modules.equipmentInventory.vo.InventoryProgressVO;
+import org.jeecg.modules.system.entity.SysUser;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+/**
+ * @Description: 盘点计划
+ * @Author: jeecg-boot
+ * @Date: 2025-04-10
+ * @Version: V1.0
+ */
+@Api(tags = "盘点计划")
+@RestController
+@RequestMapping("/equipmentInventory/inventoryPlan")
+@Slf4j
+public class InventoryPlanController {
+
+    @Lazy
+    @Resource
+    private CommonAPI commonApi;
+
+    @Lazy
+    @Resource
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private IInventoryPlanService inventoryPlanService;
+    @Autowired
+    private IInventoryTaskService inventoryTaskService;
+    @Autowired
+    private IInventoryListService inventoryListService;
+    @Autowired
+    private ISysUserService sysUserService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param inventoryPlan
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    //@AutoLog(value = "盘点计划-分页列表查询")
+    @ApiOperation(value = "盘点计划-分页列表查询", notes = "盘点计划-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<InventoryPlan>> queryPageList(InventoryPlan inventoryPlan,
+                                                      @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                      @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                      HttpServletRequest req) {
+        QueryWrapper<InventoryPlan> queryWrapper = QueryGenerator.initQueryWrapper(inventoryPlan, req.getParameterMap());
+        Page<InventoryPlan> page = new Page<>(pageNo, pageSize);
+        IPage<InventoryPlan> pageList = inventoryPlanService.page(page, queryWrapper);
+
+        // 处理每条数据的mainDirector字段
+        List<InventoryPlan> records = pageList.getRecords();
+        for (InventoryPlan plan : records) {
+            String mainDirectorIds = plan.getMainDirector();
+            if (StringUtils.isNotBlank(mainDirectorIds)) {
+                List<String> idList = Arrays.asList(mainDirectorIds.split(","));
+                if (!idList.isEmpty()) {
+                    List<SysUser> users = sysUserService.listByIds(idList);
+                    String realNames = users.stream()
+                            .map(SysUser::getRealname)
+                            .filter(StringUtils::isNotBlank)
+                            .collect(Collectors.joining(","));
+                    plan.setMainDirector(realNames);
+                }
+            }
+        }
+
+        return Result.OK(pageList);
+    }
+
+
+    /**
+     * 添加
+     *
+     * @param inventoryPlanPage
+     * @return
+     */
+    @AutoLog(value = "盘点计划-添加")
+    @ApiOperation(value = "盘点计划-添加", notes = "盘点计划-添加")
+    @RequiresPermissions("equipmentInventory:sbsmzq_inventory_plan:add")
+    @PostMapping(value = "/add")
+    public Result<String> add(@RequestBody InventoryPlanPage inventoryPlanPage) {
+        InventoryPlan inventoryPlan = new InventoryPlan();
+        BeanUtils.copyProperties(inventoryPlanPage, inventoryPlan);
+        inventoryPlanService.saveMain(inventoryPlan, inventoryPlanPage.getInventoryTaskList(), inventoryPlanPage.getInventoryListList());
+        return Result.OK("添加成功!");
+    }
+
+    /**
+     * 编辑
+     *
+     * @param inventoryPlanPage
+     * @return
+     */
+    @AutoLog(value = "盘点计划-编辑")
+    @ApiOperation(value = "盘点计划-编辑", notes = "盘点计划-编辑")
+    @RequiresPermissions("equipmentInventory:sbsmzq_inventory_plan:edit")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<String> edit(@RequestBody InventoryPlanPage inventoryPlanPage) {
+        InventoryPlan inventoryPlan = new InventoryPlan();
+        BeanUtils.copyProperties(inventoryPlanPage, inventoryPlan);
+        InventoryPlan inventoryPlanEntity = inventoryPlanService.getById(inventoryPlan.getId());
+        if (inventoryPlanEntity == null) {
+            return Result.error("未找到对应数据");
+        }
+        inventoryPlanService.updateMain(inventoryPlan, inventoryPlanPage.getInventoryTaskList(), inventoryPlanPage.getInventoryListList());
+        return Result.OK("编辑成功!");
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "盘点计划-通过id删除")
+    @ApiOperation(value = "盘点计划-通过id删除", notes = "盘点计划-通过id删除")
+    @RequiresPermissions("equipmentInventory:sbsmzq_inventory_plan:delete")
+    @DeleteMapping(value = "/delete")
+    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
+        inventoryPlanService.delMain(id);
+        return Result.OK("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "盘点计划-批量删除")
+    @ApiOperation(value = "盘点计划-批量删除", notes = "盘点计划-批量删除")
+    @RequiresPermissions("equipmentInventory:sbsmzq_inventory_plan:deleteBatch")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.inventoryPlanService.delBatchMain(Arrays.asList(ids.split(",")));
+        return Result.OK("批量删除成功!");
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    //@AutoLog(value = "盘点计划-通过id查询")
+    @ApiOperation(value = "盘点计划-通过id查询", notes = "盘点计划-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<InventoryPlan> queryById(@RequestParam(name = "id", required = true) String id) {
+        InventoryPlan inventoryPlan = inventoryPlanService.getById(id);
+        if (inventoryPlan == null) {
+            return Result.error("未找到对应数据");
+        }
+        return Result.OK(inventoryPlan);
+
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    //@AutoLog(value = "盘点任务通过主表ID查询")
+    @ApiOperation(value = "盘点任务主表ID查询", notes = "盘点任务-通主表ID查询")
+    @GetMapping(value = "/queryInventoryTaskByMainId")
+    public Result<List<InventoryTask>> queryInventoryTaskListByMainId(@RequestParam(name = "id", required = true) String id) {
+        List<InventoryTask> inventoryTaskList = inventoryTaskService.selectByMainId(id);
+        return Result.OK(inventoryTaskList);
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    //@AutoLog(value = "盘点清单通过主表ID查询")
+    @ApiOperation(value = "盘点清单主表ID查询", notes = "盘点清单-通主表ID查询")
+    @GetMapping(value = "/queryInventoryListByMainId")
+    public Result<List<InventoryList>> queryInventoryListListByMainId(@RequestParam(name = "id", required = true) String id) {
+        List<InventoryList> inventoryListList = inventoryListService.selectByMainId(id);
+        return Result.OK(inventoryListList);
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param inventoryPlan
+     */
+    @RequiresPermissions("equipmentInventory:sbsmzq_inventory_plan:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, InventoryPlan inventoryPlan) {
+        // Step.1 组装查询条件查询数据
+        QueryWrapper<InventoryPlan> queryWrapper = QueryGenerator.initQueryWrapper(inventoryPlan, request.getParameterMap());
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+        //配置选中数据查询条件
+        String selections = request.getParameter("selections");
+        if (oConvertUtils.isNotEmpty(selections)) {
+            List<String> selectionList = Arrays.asList(selections.split(","));
+            queryWrapper.in("id", selectionList);
+        }
+        //Step.2 获取导出数据
+        List<InventoryPlan> inventoryPlanList = inventoryPlanService.list(queryWrapper);
+
+        // Step.3 组装pageList
+        List<InventoryPlanPage> pageList = new ArrayList<InventoryPlanPage>();
+        for (InventoryPlan main : inventoryPlanList) {
+            InventoryPlanPage vo = new InventoryPlanPage();
+            BeanUtils.copyProperties(main, vo);
+            List<InventoryTask> inventoryTaskList = inventoryTaskService.selectByMainId(main.getId());
+            vo.setInventoryTaskList(inventoryTaskList);
+            List<InventoryList> inventoryListList = inventoryListService.selectByMainId(main.getId());
+            vo.setInventoryListList(inventoryListList);
+            pageList.add(vo);
+        }
+
+        // Step.4 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        mv.addObject(NormalExcelConstants.FILE_NAME, "盘点计划列表");
+        mv.addObject(NormalExcelConstants.CLASS, InventoryPlanPage.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("盘点计划数据", "导出人:" + sysUser.getRealname(), "盘点计划"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequiresPermissions("equipmentInventory:sbsmzq_inventory_plan:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            // 获取上传文件对象
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<InventoryPlanPage> list = ExcelImportUtil.importExcel(file.getInputStream(), InventoryPlanPage.class, params);
+                for (InventoryPlanPage page : list) {
+                    InventoryPlan po = new InventoryPlan();
+                    BeanUtils.copyProperties(page, po);
+                    inventoryPlanService.saveMain(po, page.getInventoryTaskList(), page.getInventoryListList());
+                }
+                return Result.OK("文件导入成功!数据行数:" + list.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.OK("文件导入失败!");
+    }
+
+
+    /**
+     * 分页列表查询(与我相关)
+     *
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @ApiOperation(value = "盘点计划-分页列表查询(与我相关)", notes = "盘点计划-分页列表查询(与我相关)")
+    @GetMapping(value = "/planListByUser")
+    public Result<IPage<InventoryPlan>> queryPagePlanListByUser(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                HttpServletRequest req) {
+
+        LoginUser loginUser = TokenUtils.getLoginUser(req, commonApi, redisUtil);
+        // 构建查询条件
+        LambdaQueryWrapper<InventoryPlan> queryWrapper = new LambdaQueryWrapper<>();
+        /**
+         * InventoryPlan::getMainDirector 字段存储的是 用逗号分隔的多个用户ID,比如:"1,2,3"
+         * 要用 loginUser.getId() 去查询这个字段中包含该用户ID的记录,比如 loginUser.getId() 是 "1",就要能匹配 "1,2", "2,1,3" 之类的
+         */
+        queryWrapper.apply("CONCAT(',', main_director, ',') LIKE CONCAT('%,', {0}, ',%')", loginUser.getId());
+        QueryGenerator.initQueryWrapper(queryWrapper, req.getParameterMap());
+
+        Page<InventoryPlan> page = new Page<InventoryPlan>(pageNo, pageSize);
+        IPage<InventoryPlan> pageList = inventoryPlanService.page(page, queryWrapper);
+        return Result.OK(pageList);
+    }
+
+
+    /**
+     * @param planId 盘点计划id
+     * @return
+     */
+    @ApiOperation(value = "盘点计划整体盘点进度", notes = "盘点计划整体盘点进度")
+    @GetMapping(value = "/overallInventoryProgress")
+    public Result<InventoryProgressVO> overallInventoryProgress(@RequestParam(name = "planId", required = true) String planId) {
+        InventoryProgressVO inventoryProgressVO = inventoryTaskService.overallInventoryProgress(planId);
+        return Result.OK(inventoryProgressVO);
+    }
+
+
+    /**
+     * 通过参数查询
+     *
+     * @param queryDTO
+     * @return
+     */
+    @ApiOperation(value = "盘点清单通过参数查询", notes = "盘点清单通过参数查询")
+    @GetMapping(value = "/queryInventoryListByQueryParams")
+    public Result<List<InventoryList>> queryInventoryListByQueryParams(InventoryPlanQueryDTO queryDTO) {
+        List<InventoryList> inventoryLists = inventoryListService.queryInventoryListByQueryParams(queryDTO);
+        return Result.OK(inventoryLists);
+    }
+
+
+    /**
+     * 分页列表查询(与我相关)
+     *
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @ApiOperation(value = "盘点任务-分页列表查询(与我相关)", notes = "盘点任务-分页列表查询(与我相关)")
+    @GetMapping(value = "/taskListByUser")
+    public Result<IPage<InventoryTask>> queryPageTaskListByUser(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                HttpServletRequest req) {
+
+        LoginUser loginUser = TokenUtils.getLoginUser(req, commonApi, redisUtil);
+        // 构建查询条件
+        LambdaQueryWrapper<InventoryTask> queryWrapper = new LambdaQueryWrapper<>();
+        /**
+         * InventoryTask::getDirector 字段存储的是 用逗号分隔的多个用户ID,比如:"1,2,3"
+         * 要用 loginUser.getId() 去查询这个字段中包含该用户ID的记录,比如 loginUser.getId() 是 "1",就要能匹配 "1,2", "2,1,3" 之类的
+         */
+        queryWrapper.apply("CONCAT(',', director, ',') LIKE CONCAT('%,', {0}, ',%')", loginUser.getId());
+        QueryGenerator.initQueryWrapper(queryWrapper, req.getParameterMap());
+
+        Page<InventoryTask> page = new Page<InventoryTask>(pageNo, pageSize);
+        IPage<InventoryTask> pageList = inventoryTaskService.page(page, queryWrapper);
+        return Result.OK(pageList);
+    }
+
+
+    /**
+     * 盘点任务分页列表查询
+     *
+     * @param inventoryTask
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @ApiOperation(value = "盘点任务-分页列表查询", notes = "盘点任务-分页列表查询")
+    @GetMapping(value = "/taskList")
+    public Result<IPage<InventoryTask>> queryPageTaskList(InventoryTask inventoryTask,
+                                                          @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                          @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                          HttpServletRequest req) {
+        QueryWrapper<InventoryTask> queryWrapper = QueryGenerator.initQueryWrapper(inventoryTask, req.getParameterMap());
+
+        if (StringUtils.isNotBlank(inventoryTask.getDirector())) {
+            queryWrapper.apply("CONCAT(',', director, ',') LIKE CONCAT('%,', {0}, ',%')", inventoryTask.getDirector());
+        }
+
+        Page<InventoryTask> page = new Page<InventoryTask>(pageNo, pageSize);
+        IPage<InventoryTask> pageList = inventoryTaskService.page(page, queryWrapper);
+        return Result.OK(pageList);
+    }
+
+}

+ 50 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/dto/InventoryPlanQueryDTO.java

@@ -0,0 +1,50 @@
+package org.jeecg.modules.equipmentInventory.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+@Data
+public class InventoryPlanQueryDTO {
+
+    /**
+     * 设备名称
+     */
+    @Excel(name = "设备名称", width = 15)
+    @ApiModelProperty(value = "设备名称")
+    private String equipmentName;
+
+    /**
+     * 台账位置
+     */
+    @Excel(name = "台账位置", width = 15)
+    @ApiModelProperty(value = "台账位置")
+    private String ledgerLocation;
+
+
+    /**
+     * 所属部门
+     */
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+
+    /**
+     * 任务id
+     */
+    @Excel(name = "任务id", width = 15)
+    @ApiModelProperty(value = "任务id")
+    private String taskId;
+
+    /**
+     * 盘点计划id
+     */
+    @ApiModelProperty(value = "盘点计划id")
+    private String planId;
+
+    /**
+     * 盘点状态
+     */
+    @Excel(name = "盘点状态", width = 15)
+    @ApiModelProperty(value = "盘点状态")
+    private Integer inventoryStatus;
+}

+ 170 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/entity/InventoryList.java

@@ -0,0 +1,170 @@
+package org.jeecg.modules.equipmentInventory.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 盘点清单
+ * @Author: jeecg-boot
+ * @Date: 2025-04-10
+ * @Version: V1.0
+ */
+@ApiModel(value = "sbsmzq_inventory_list对象", description = "盘点清单")
+@Data
+@TableName("sbsmzq_inventory_list")
+public class InventoryList implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+    /**
+     * 创建日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+    /**
+     * 更新人
+     */
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+    /**
+     * 更新日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+    /**
+     * 所属部门
+     */
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+    /**
+     * 设备编号
+     */
+    @Excel(name = "设备编号", width = 15)
+    @ApiModelProperty(value = "设备编号")
+    private String equipmentNum;
+    /**
+     * 设备名称
+     */
+    @Excel(name = "设备名称", width = 15)
+    @ApiModelProperty(value = "设备名称")
+    private String equipmentName;
+    /**
+     * 资产编号
+     */
+    @Excel(name = "资产编号", width = 15)
+    @ApiModelProperty(value = "资产编号")
+    private String assetNum;
+    /**
+     * 类别
+     */
+    @Excel(name = "类别", width = 15)
+    @ApiModelProperty(value = "类别")
+    private String category;
+    /**
+     * 品牌
+     */
+    @Excel(name = "品牌", width = 15)
+    @ApiModelProperty(value = "品牌")
+    private String brand;
+    /**
+     * 负责人
+     */
+    @Excel(name = "负责人", width = 15)
+    @ApiModelProperty(value = "负责人")
+    private String director;
+    /**
+     * 台账位置
+     */
+    @Excel(name = "台账位置", width = 15)
+    @ApiModelProperty(value = "台账位置")
+    private String ledgerLocation;
+    /**
+     * 盘点位置
+     */
+    @Excel(name = "盘点位置", width = 15)
+    @ApiModelProperty(value = "盘点位置")
+    private String inventoryLocation;
+    /**
+     * 盘点序列号
+     */
+    @Excel(name = "盘点序列号", width = 15)
+    @ApiModelProperty(value = "盘点序列号")
+    private String inventorySerialNumber;
+    /**
+     * 盘点负责人
+     */
+    @Excel(name = "盘点负责人", width = 15)
+    @ApiModelProperty(value = "盘点负责人")
+    private String inventoryDirector;
+    /**
+     * 盘点使用状态
+     */
+    @Excel(name = "盘点使用状态", width = 15)
+    @ApiModelProperty(value = "盘点使用状态")
+    private String inventoryUseStatus;
+    /**
+     * 盘点状态
+     */
+    @Excel(name = "盘点状态", width = 15)
+    @ApiModelProperty(value = "盘点状态")
+    private String inventoryStatus;
+    /**
+     * 盘点人
+     */
+    @Excel(name = "盘点人", width = 15)
+    @ApiModelProperty(value = "盘点人")
+    private String inventoryPerson;
+    /**
+     * 盘点时间
+     */
+    @Excel(name = "盘点时间", width = 15)
+    @ApiModelProperty(value = "盘点时间")
+    private String inventoryTime;
+    /**
+     * 说明
+     */
+    @Excel(name = "说明", width = 15)
+    @ApiModelProperty(value = "说明")
+    private String description;
+    /**
+     * 图片
+     */
+    @Excel(name = "图片", width = 15)
+    @ApiModelProperty(value = "图片")
+    private String pictures;
+    /**
+     * 任务id
+     */
+    @Excel(name = "任务id", width = 15)
+    @ApiModelProperty(value = "任务id")
+    private String taskId;
+    /**
+     * 盘点计划id
+     */
+    @ApiModelProperty(value = "盘点计划id")
+    private String planId;
+}

+ 147 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/entity/InventoryPlan.java

@@ -0,0 +1,147 @@
+package org.jeecg.modules.equipmentInventory.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 盘点计划
+ * @Author: jeecg-boot
+ * @Date: 2025-04-10
+ * @Version: V1.0
+ */
+@ApiModel(value = "sbsmzq_inventory_plan对象", description = "盘点计划")
+@Data
+@TableName("sbsmzq_inventory_plan")
+public class InventoryPlan implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+    /**
+     * 创建日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+    /**
+     * 更新人
+     */
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+    /**
+     * 更新日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+    /**
+     * 所属部门
+     */
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+    /**
+     * 计划编号
+     */
+    @Excel(name = "计划编号", width = 15)
+    @ApiModelProperty(value = "计划编号")
+    private String planNumber;
+    /**
+     * 标题
+     */
+    @Excel(name = "标题", width = 15)
+    @ApiModelProperty(value = "标题")
+    private String title;
+    /**
+     * 计划部门
+     */
+    @Excel(name = "计划部门", width = 15)
+    @ApiModelProperty(value = "计划部门")
+    private String planDepartment;
+    /**
+     * 审批状态
+     */
+    @Excel(name = "审批状态", width = 15)
+    @ApiModelProperty(value = "审批状态")
+    private Integer approvalStatus;
+    /**
+     * 主负责人
+     */
+    @Excel(name = "主负责人", width = 15)
+    @ApiModelProperty(value = "主负责人")
+    private String mainDirector;
+    /**
+     * 应盘
+     */
+    @Excel(name = "应盘", width = 15)
+    @ApiModelProperty(value = "应盘")
+    private Integer planCount;
+    /**
+     * 已盘
+     */
+    @Excel(name = "已盘", width = 15)
+    @ApiModelProperty(value = "已盘")
+    private Integer actualCount;
+    /**
+     * 当前节点
+     */
+    @Excel(name = "当前节点", width = 15)
+    @ApiModelProperty(value = "当前节点")
+    private String currentNode;
+    /**
+     * 审批结束时间
+     */
+    @Excel(name = "审批结束时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "审批结束时间")
+    private Date approvalEndTime;
+    /**
+     * 计划开始时间
+     */
+    @Excel(name = "计划开始时间", width = 15, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "计划开始时间")
+    private Date planStartTime;
+    /**
+     * 计划结束时间
+     */
+    @Excel(name = "计划结束时间", width = 15, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "计划结束时间")
+    private Date planEndTime;
+    /**
+     * 盘点字段
+     */
+    @Excel(name = "盘点字段", width = 15)
+    @ApiModelProperty(value = "盘点字段")
+    private String inventoryFields;
+    /**
+     * 备注
+     */
+    @Excel(name = "备注", width = 15)
+    @ApiModelProperty(value = "备注")
+    private String remark;
+}

+ 215 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/entity/InventoryTask.java

@@ -0,0 +1,215 @@
+package org.jeecg.modules.equipmentInventory.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Description: 盘点任务
+ * @Author: jeecg-boot
+ * @Date: 2025-04-10
+ * @Version: V1.0
+ */
+@ApiModel(value = "sbsmzq_inventory_task对象", description = "盘点任务")
+@Data
+@TableName("sbsmzq_inventory_task")
+public class InventoryTask implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+    /**
+     * 创建日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+    /**
+     * 更新人
+     */
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+    /**
+     * 更新日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+    /**
+     * 所属部门
+     */
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+    /**
+     * 任务编号
+     */
+    @Excel(name = "任务编号", width = 15)
+    @ApiModelProperty(value = "任务编号")
+    private String taskNumber;
+    /**
+     * 计划编号
+     */
+    @Excel(name = "计划编号", width = 15)
+    @ApiModelProperty(value = "计划编号")
+    private String planNumber;
+    /**
+     * 盘点范围
+     */
+    @Excel(name = "盘点范围", width = 15)
+    @ApiModelProperty(value = "盘点范围")
+    private String inventoryScope;
+    /**
+     * 责任单位
+     */
+    @Excel(name = "责任单位", width = 15)
+    @ApiModelProperty(value = "责任单位")
+    private String responsibilityUnit;
+    /**
+     * 计划负责人
+     */
+    @Excel(name = "计划负责人", width = 15)
+    @ApiModelProperty(value = "计划负责人")
+    private String planDirector;
+    /**
+     * 负责人
+     */
+    @Excel(name = "负责人", width = 15)
+    @ApiModelProperty(value = "负责人")
+    private String director;
+    /**
+     * 盘点方式
+     */
+    @Excel(name = "盘点方式", width = 15)
+    @ApiModelProperty(value = "盘点方式")
+    private String inventoryMode;
+    /**
+     * 是否开启抽盘
+     */
+    @Excel(name = "是否开启抽盘", width = 15)
+    @ApiModelProperty(value = "是否开启抽盘")
+    private Integer openTakePlate;
+    /**
+     * 抽盘类型
+     */
+    @Excel(name = "抽盘类型", width = 15)
+    @ApiModelProperty(value = "抽盘类型")
+    private Integer takePlateType;
+    /**
+     * 仅支持NFC/RFID
+     */
+    @Excel(name = "仅支持NFC/RFID", width = 15)
+    @ApiModelProperty(value = "仅支持NFC/RFID")
+    private Integer nfcOnly;
+    /**
+     * 任务开始时间
+     */
+    @Excel(name = "任务开始时间", width = 15, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "任务开始时间")
+    private Date taskStartTime;
+    /**
+     * 任务结束时间
+     */
+    @Excel(name = "任务结束时间", width = 15, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "任务结束时间")
+    private Date taskEndTime;
+    /**
+     * 计划盘点开始时间
+     */
+    @Excel(name = "计划盘点开始时间", width = 15, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "计划盘点开始时间")
+    private Date planInventoryStartTime;
+    /**
+     * 计划盘点结束时间
+     */
+    @Excel(name = "计划盘点结束时间", width = 15, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "计划盘点结束时间")
+    private Date planInventoryEndTime;
+    /**
+     * 任务状态
+     */
+    @Excel(name = "任务状态", width = 15)
+    @ApiModelProperty(value = "任务状态")
+    private Integer taskStatus;
+    /**
+     * 应盘
+     */
+    @Excel(name = "应盘", width = 15)
+    @ApiModelProperty(value = "应盘")
+    private Integer planCount;
+    /**
+     * 已盘
+     */
+    @Excel(name = "已盘", width = 15)
+    @ApiModelProperty(value = "已盘")
+    private Integer actualCount;
+    /**
+     * 盘亏
+     */
+    @Excel(name = "盘亏", width = 15)
+    @ApiModelProperty(value = "盘亏")
+    private Integer inventoryLoss;
+    /**
+     * 盘盈
+     */
+    @Excel(name = "盘盈", width = 15)
+    @ApiModelProperty(value = "盘盈")
+    private Integer inventoryGain;
+    /**
+     * 完成度
+     */
+    @Excel(name = "完成度", width = 15)
+    @ApiModelProperty(value = "完成度")
+    private BigDecimal completion;
+    /**
+     * 标题
+     */
+    @Excel(name = "标题", width = 15)
+    @ApiModelProperty(value = "标题")
+    private String title;
+    /**
+     * 盘点单号
+     */
+    @Excel(name = "盘点单号", width = 15)
+    @ApiModelProperty(value = "盘点单号")
+    private String inventoryNumber;
+    /**
+     * 备注
+     */
+    @Excel(name = "备注", width = 15)
+    @ApiModelProperty(value = "备注")
+    private String remark;
+    /**
+     * 盘点计划id(外键)
+     */
+    @ApiModelProperty(value = "盘点计划id(外键)")
+    private String planId;
+}

+ 31 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/mapper/InventoryListMapper.java

@@ -0,0 +1,31 @@
+package org.jeecg.modules.equipmentInventory.mapper;
+
+import java.util.List;
+import org.jeecg.modules.equipmentInventory.entity.InventoryList;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @Description: 盘点清单
+ * @Author: jeecg-boot
+ * @Date:   2025-04-10
+ * @Version: V1.0
+ */
+public interface InventoryListMapper extends BaseMapper<InventoryList> {
+
+	/**
+	 * 通过主表id删除子表数据
+	 *
+	 * @param mainId 主表id
+	 * @return boolean
+	 */
+	public boolean deleteByMainId(@Param("mainId") String mainId);
+
+  /**
+   * 通过主表id查询子表数据
+   *
+   * @param mainId 主表id
+   * @return List<InventoryList>
+   */
+	public List<InventoryList> selectByMainId(@Param("mainId") String mainId);
+}

+ 14 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/mapper/InventoryPlanMapper.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.equipmentInventory.mapper;
+
+import org.jeecg.modules.equipmentInventory.entity.InventoryPlan;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 盘点计划
+ * @Author: jeecg-boot
+ * @Date:   2025-04-10
+ * @Version: V1.0
+ */
+public interface InventoryPlanMapper extends BaseMapper<InventoryPlan> {
+
+}

+ 31 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/mapper/InventoryTaskMapper.java

@@ -0,0 +1,31 @@
+package org.jeecg.modules.equipmentInventory.mapper;
+
+import java.util.List;
+import org.jeecg.modules.equipmentInventory.entity.InventoryTask;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @Description: 盘点任务
+ * @Author: jeecg-boot
+ * @Date:   2025-04-10
+ * @Version: V1.0
+ */
+public interface InventoryTaskMapper extends BaseMapper<InventoryTask> {
+
+	/**
+	 * 通过主表id删除子表数据
+	 *
+	 * @param mainId 主表id
+	 * @return boolean
+	 */
+	public boolean deleteByMainId(@Param("mainId") String mainId);
+
+  /**
+   * 通过主表id查询子表数据
+   *
+   * @param mainId 主表id
+   * @return List<InventoryTask>
+   */
+	public List<InventoryTask> selectByMainId(@Param("mainId") String mainId);
+}

+ 16 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/mapper/xml/InventoryListMapper.xml

@@ -0,0 +1,16 @@
+<?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="org.jeecg.modules.equipmentInventory.mapper.InventoryListMapper">
+
+	<delete id="deleteByMainId" parameterType="java.lang.String">
+		DELETE 
+		FROM  sbsmzq_inventory_list 
+		WHERE
+			 plan_id = #{mainId} 	</delete>
+	
+	<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.equipmentInventory.entity.InventoryList">
+		SELECT * 
+		FROM  sbsmzq_inventory_list
+		WHERE
+			 plan_id = #{mainId} 	</select>
+</mapper>

+ 5 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/mapper/xml/InventoryPlanMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.equipmentInventory.mapper.InventoryPlanMapper">
+
+</mapper>

+ 16 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/mapper/xml/InventoryTaskMapper.xml

@@ -0,0 +1,16 @@
+<?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="org.jeecg.modules.equipmentInventory.mapper.InventoryTaskMapper">
+
+	<delete id="deleteByMainId" parameterType="java.lang.String">
+		DELETE 
+		FROM  sbsmzq_inventory_task 
+		WHERE
+			 plan_id = #{mainId} 	</delete>
+	
+	<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.equipmentInventory.entity.InventoryTask">
+		SELECT * 
+		FROM  sbsmzq_inventory_task
+		WHERE
+			 plan_id = #{mainId} 	</select>
+</mapper>

+ 26 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/service/IInventoryListService.java

@@ -0,0 +1,26 @@
+package org.jeecg.modules.equipmentInventory.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.equipmentInventory.dto.InventoryPlanQueryDTO;
+import org.jeecg.modules.equipmentInventory.entity.InventoryList;
+
+import java.util.List;
+
+/**
+ * @Description: 盘点清单
+ * @Author: jeecg-boot
+ * @Date: 2025-04-10
+ * @Version: V1.0
+ */
+public interface IInventoryListService extends IService<InventoryList> {
+
+    /**
+     * 通过主表id查询子表数据
+     *
+     * @param mainId 主表id
+     * @return List<InventoryList>
+     */
+    List<InventoryList> selectByMainId(String mainId);
+
+    List<InventoryList> queryInventoryListByQueryParams(InventoryPlanQueryDTO queryDTO);
+}

+ 51 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/service/IInventoryPlanService.java

@@ -0,0 +1,51 @@
+package org.jeecg.modules.equipmentInventory.service;
+
+import org.jeecg.modules.equipmentInventory.entity.InventoryTask;
+import org.jeecg.modules.equipmentInventory.entity.InventoryList;
+import org.jeecg.modules.equipmentInventory.entity.InventoryPlan;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @Description: 盘点计划
+ * @Author: jeecg-boot
+ * @Date:   2025-04-10
+ * @Version: V1.0
+ */
+public interface IInventoryPlanService extends IService<InventoryPlan> {
+
+	/**
+	 * 添加一对多
+	 *
+	 * @param inventoryPlan
+	 * @param inventoryTaskList
+	 * @param inventoryListList
+	 */
+	public void saveMain(InventoryPlan inventoryPlan,List<InventoryTask> inventoryTaskList,List<InventoryList> inventoryListList) ;
+	
+	/**
+	 * 修改一对多
+	 *
+   * @param inventoryPlan
+   * @param inventoryTaskList
+   * @param inventoryListList
+	 */
+	public void updateMain(InventoryPlan inventoryPlan,List<InventoryTask> inventoryTaskList,List<InventoryList> inventoryListList);
+	
+	/**
+	 * 删除一对多
+	 *
+	 * @param id
+	 */
+	public void delMain (String id);
+	
+	/**
+	 * 批量删除一对多
+	 *
+	 * @param idList
+	 */
+	public void delBatchMain (Collection<? extends Serializable> idList);
+	
+}

+ 26 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/service/IInventoryTaskService.java

@@ -0,0 +1,26 @@
+package org.jeecg.modules.equipmentInventory.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.equipmentInventory.entity.InventoryTask;
+import org.jeecg.modules.equipmentInventory.vo.InventoryProgressVO;
+
+import java.util.List;
+
+/**
+ * @Description: 盘点任务
+ * @Author: jeecg-boot
+ * @Date: 2025-04-10
+ * @Version: V1.0
+ */
+public interface IInventoryTaskService extends IService<InventoryTask> {
+
+    /**
+     * 通过主表id查询子表数据
+     *
+     * @param mainId 主表id
+     * @return List<InventoryTask>
+     */
+    List<InventoryTask> selectByMainId(String mainId);
+
+    InventoryProgressVO overallInventoryProgress(String planId);
+}

+ 65 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/service/impl/InventoryListServiceImpl.java

@@ -0,0 +1,65 @@
+package org.jeecg.modules.equipmentInventory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang.StringUtils;
+import org.jeecg.modules.equipmentInventory.dto.InventoryPlanQueryDTO;
+import org.jeecg.modules.equipmentInventory.entity.InventoryList;
+import org.jeecg.modules.equipmentInventory.mapper.InventoryListMapper;
+import org.jeecg.modules.equipmentInventory.service.IInventoryListService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @Description: 盘点清单
+ * @Author: jeecg-boot
+ * @Date: 2025-04-10
+ * @Version: V1.0
+ */
+@Service
+public class InventoryListServiceImpl extends ServiceImpl<InventoryListMapper, InventoryList> implements IInventoryListService {
+
+    @Autowired
+    private InventoryListMapper inventoryListMapper;
+
+    @Override
+    public List<InventoryList> selectByMainId(String mainId) {
+        return inventoryListMapper.selectByMainId(mainId);
+    }
+
+    @Override
+    public List<InventoryList> queryInventoryListByQueryParams(InventoryPlanQueryDTO queryDTO) {
+
+        LambdaQueryWrapper<InventoryList> queryWrapper = new LambdaQueryWrapper<>();
+
+        if (StringUtils.isNotBlank(queryDTO.getEquipmentName())) {
+            queryWrapper.like(InventoryList::getEquipmentName, queryDTO.getEquipmentName());
+        }
+
+        if (StringUtils.isNotBlank(queryDTO.getLedgerLocation())) {
+            queryWrapper.eq(InventoryList::getInventoryLocation, queryDTO.getLedgerLocation());
+        }
+
+        if (StringUtils.isNotBlank(queryDTO.getSysOrgCode())) {
+            queryWrapper.eq(InventoryList::getSysOrgCode, queryDTO.getSysOrgCode());
+        }
+
+        if (StringUtils.isNotBlank(queryDTO.getPlanId())) {
+            queryWrapper.eq(InventoryList::getPlanId, queryDTO.getPlanId());
+        }
+
+        if (StringUtils.isNotBlank(queryDTO.getTaskId())) {
+            queryWrapper.eq(InventoryList::getTaskId, queryDTO.getTaskId());
+        }
+
+        if (null != queryDTO.getInventoryStatus()) {
+            queryWrapper.eq(InventoryList::getInventoryStatus, queryDTO.getInventoryStatus());
+        }
+
+        List<InventoryList> inventoryLists = inventoryListMapper.selectList(queryWrapper);
+
+        return inventoryLists;
+    }
+}

+ 121 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/service/impl/InventoryPlanServiceImpl.java

@@ -0,0 +1,121 @@
+package org.jeecg.modules.equipmentInventory.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.equipmentInventory.entity.InventoryList;
+import org.jeecg.modules.equipmentInventory.entity.InventoryPlan;
+import org.jeecg.modules.equipmentInventory.entity.InventoryTask;
+import org.jeecg.modules.equipmentInventory.mapper.InventoryListMapper;
+import org.jeecg.modules.equipmentInventory.mapper.InventoryPlanMapper;
+import org.jeecg.modules.equipmentInventory.mapper.InventoryTaskMapper;
+import org.jeecg.modules.equipmentInventory.service.IInventoryPlanService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @Description: 盘点计划
+ * @Author: jeecg-boot
+ * @Date: 2025-04-10
+ * @Version: V1.0
+ */
+@Service
+public class InventoryPlanServiceImpl extends ServiceImpl<InventoryPlanMapper, InventoryPlan> implements IInventoryPlanService {
+
+    @Autowired
+    private InventoryPlanMapper inventoryPlanMapper;
+    @Autowired
+    private InventoryTaskMapper inventoryTaskMapper;
+    @Autowired
+    private InventoryListMapper inventoryListMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveMain(InventoryPlan inventoryPlan, List<InventoryTask> inventoryTaskList, List<InventoryList> inventoryListList) {
+        inventoryPlanMapper.insert(inventoryPlan);
+        if (inventoryTaskList != null && inventoryTaskList.size() > 0) {
+            for (InventoryTask entity : inventoryTaskList) {
+                //外键设置
+                entity.setPlanId(inventoryPlan.getId());
+
+                // 计算完成度: (已盘 + 盘亏) / 应盘
+                if (entity.getPlanCount() > 0) {
+                    BigDecimal completion = BigDecimal.valueOf(entity.getActualCount() + entity.getInventoryLoss())
+                            .divide(BigDecimal.valueOf(entity.getPlanCount()), 2, RoundingMode.HALF_UP);
+                    entity.setCompletion(completion);
+                } else {
+                    entity.setCompletion(BigDecimal.ZERO);
+                }
+
+                inventoryTaskMapper.insert(entity);
+            }
+        }
+        if (inventoryListList != null && inventoryListList.size() > 0) {
+            for (InventoryList entity : inventoryListList) {
+                //外键设置
+                entity.setPlanId(inventoryPlan.getId());
+                inventoryListMapper.insert(entity);
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateMain(InventoryPlan inventoryPlan, List<InventoryTask> inventoryTaskList, List<InventoryList> inventoryListList) {
+        inventoryPlanMapper.updateById(inventoryPlan);
+
+        //1.先删除子表数据
+        inventoryTaskMapper.deleteByMainId(inventoryPlan.getId());
+        inventoryListMapper.deleteByMainId(inventoryPlan.getId());
+
+        //2.子表数据重新插入
+        if (inventoryTaskList != null && inventoryTaskList.size() > 0) {
+            for (InventoryTask entity : inventoryTaskList) {
+                //外键设置
+                entity.setPlanId(inventoryPlan.getId());
+
+                // 计算完成度: (已盘 + 盘亏) / 应盘
+                if (entity.getPlanCount() > 0) {
+                    BigDecimal completion = BigDecimal.valueOf(entity.getActualCount() + entity.getInventoryLoss())
+                            .divide(BigDecimal.valueOf(entity.getPlanCount()), 2, RoundingMode.HALF_UP);
+                    entity.setCompletion(completion);
+                } else {
+                    entity.setCompletion(BigDecimal.ZERO);
+                }
+
+                inventoryTaskMapper.insert(entity);
+            }
+        }
+        if (inventoryListList != null && inventoryListList.size() > 0) {
+            for (InventoryList entity : inventoryListList) {
+                //外键设置
+                entity.setPlanId(inventoryPlan.getId());
+                inventoryListMapper.insert(entity);
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void delMain(String id) {
+        inventoryTaskMapper.deleteByMainId(id);
+        inventoryListMapper.deleteByMainId(id);
+        inventoryPlanMapper.deleteById(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void delBatchMain(Collection<? extends Serializable> idList) {
+        for (Serializable id : idList) {
+            inventoryTaskMapper.deleteByMainId(id.toString());
+            inventoryListMapper.deleteByMainId(id.toString());
+            inventoryPlanMapper.deleteById(id);
+        }
+    }
+
+}

+ 75 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/service/impl/InventoryTaskServiceImpl.java

@@ -0,0 +1,75 @@
+package org.jeecg.modules.equipmentInventory.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.equipmentInventory.entity.InventoryTask;
+import org.jeecg.modules.equipmentInventory.mapper.InventoryTaskMapper;
+import org.jeecg.modules.equipmentInventory.service.IInventoryTaskService;
+import org.jeecg.modules.equipmentInventory.vo.InventoryProgressVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @Description: 盘点任务
+ * @Author: jeecg-boot
+ * @Date: 2025-04-10
+ * @Version: V1.0
+ */
+@Service
+public class InventoryTaskServiceImpl extends ServiceImpl<InventoryTaskMapper, InventoryTask> implements IInventoryTaskService {
+
+    @Autowired
+    private InventoryTaskMapper inventoryTaskMapper;
+
+    @Override
+    public List<InventoryTask> selectByMainId(String mainId) {
+        return inventoryTaskMapper.selectByMainId(mainId);
+    }
+
+    @Override
+    public InventoryProgressVO overallInventoryProgress(String planId) {
+
+        InventoryProgressVO inventoryProgressVO = new InventoryProgressVO();
+
+        LambdaQueryWrapper<InventoryTask> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(InventoryTask::getPlanId, planId);
+        List<InventoryTask> inventoryTasks = inventoryTaskMapper.selectList(queryWrapper);
+
+        // 初始化累加变量
+        int planCount = 0;
+        int actualCount = 0;
+        int inventoryLoss = 0;
+        int inventoryGain = 0;
+
+        // 遍历累加
+        for (InventoryTask task : inventoryTasks) {
+            planCount += Optional.ofNullable(task.getPlanCount()).orElse(0);
+            actualCount += Optional.ofNullable(task.getActualCount()).orElse(0);
+            inventoryLoss += Optional.ofNullable(task.getInventoryLoss()).orElse(0);
+            inventoryGain += Optional.ofNullable(task.getInventoryGain()).orElse(0);
+        }
+
+        // 设置VO字段
+        inventoryProgressVO.setPlanCount(planCount);
+        inventoryProgressVO.setActualCount(actualCount);
+        inventoryProgressVO.setInventoryLoss(inventoryLoss);
+        inventoryProgressVO.setInventoryGain(inventoryGain);
+
+        // 计算完成度: (已盘 + 盘亏) / 应盘
+        if (planCount > 0) {
+            BigDecimal completion = BigDecimal.valueOf(actualCount + inventoryLoss)
+                    .divide(BigDecimal.valueOf(planCount), 2, RoundingMode.HALF_UP);
+            inventoryProgressVO.setCompletion(completion);
+        } else {
+            inventoryProgressVO.setCompletion(BigDecimal.ZERO);
+        }
+
+        return inventoryProgressVO;
+    }
+
+}

+ 152 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/vo/InventoryPlanPage.java

@@ -0,0 +1,152 @@
+package org.jeecg.modules.equipmentInventory.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecg.modules.equipmentInventory.entity.InventoryList;
+import org.jeecg.modules.equipmentInventory.entity.InventoryTask;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecgframework.poi.excel.annotation.ExcelCollection;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: 盘点计划
+ * @Author: jeecg-boot
+ * @Date: 2025-04-10
+ * @Version: V1.0
+ */
+@Data
+@ApiModel(value = "sbsmzq_inventory_planPage对象", description = "盘点计划")
+public class InventoryPlanPage {
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty(value = "主键")
+    private String id;
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+    /**
+     * 创建日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+    /**
+     * 更新人
+     */
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+    /**
+     * 更新日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+    /**
+     * 所属部门
+     */
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+    /**
+     * 计划编号
+     */
+    @Excel(name = "计划编号", width = 15)
+    @ApiModelProperty(value = "计划编号")
+    private String planNumber;
+    /**
+     * 标题
+     */
+    @Excel(name = "标题", width = 15)
+    @ApiModelProperty(value = "标题")
+    private String title;
+    /**
+     * 计划部门
+     */
+    @Excel(name = "计划部门", width = 15)
+    @ApiModelProperty(value = "计划部门")
+    private String planDepartment;
+    /**
+     * 审批状态
+     */
+    @Excel(name = "审批状态", width = 15)
+    @ApiModelProperty(value = "审批状态")
+    private Integer approvalStatus;
+    /**
+     * 主负责人
+     */
+    @Excel(name = "主负责人", width = 15)
+    @ApiModelProperty(value = "主负责人")
+    private String mainDirector;
+    /**
+     * 应盘
+     */
+    @Excel(name = "应盘", width = 15)
+    @ApiModelProperty(value = "应盘")
+    private Integer planCount;
+    /**
+     * 已盘
+     */
+    @Excel(name = "已盘", width = 15)
+    @ApiModelProperty(value = "已盘")
+    private Integer actualCount;
+    /**
+     * 当前节点
+     */
+    @Excel(name = "当前节点", width = 15)
+    @ApiModelProperty(value = "当前节点")
+    private String currentNode;
+    /**
+     * 审批结束时间
+     */
+    @Excel(name = "审批结束时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "审批结束时间")
+    private Date approvalEndTime;
+    /**
+     * 计划开始时间
+     */
+    @Excel(name = "计划开始时间", width = 15, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "计划开始时间")
+    private Date planStartTime;
+    /**
+     * 计划结束时间
+     */
+    @Excel(name = "计划结束时间", width = 15, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "计划结束时间")
+    private Date planEndTime;
+    /**
+     * 盘点字段
+     */
+    @Excel(name = "盘点字段", width = 15)
+    @ApiModelProperty(value = "盘点字段")
+    private String inventoryFields;
+    /**
+     * 备注
+     */
+    @Excel(name = "备注", width = 15)
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ExcelCollection(name = "盘点任务")
+    @ApiModelProperty(value = "盘点任务")
+    private List<InventoryTask> inventoryTaskList;
+    @ExcelCollection(name = "盘点清单")
+    @ApiModelProperty(value = "盘点清单")
+    private List<InventoryList> inventoryListList;
+
+}

+ 45 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/equipmentInventory/vo/InventoryProgressVO.java

@@ -0,0 +1,45 @@
+package org.jeecg.modules.equipmentInventory.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.math.BigDecimal;
+
+@Data
+public class InventoryProgressVO {
+
+    /**
+     * 应盘
+     */
+    @Excel(name = "应盘", width = 15)
+    @ApiModelProperty(value = "应盘")
+    private Integer planCount;
+    /**
+     * 已盘
+     */
+    @Excel(name = "已盘", width = 15)
+    @ApiModelProperty(value = "已盘")
+    private Integer actualCount;
+    /**
+     * 盘亏
+     */
+    @Excel(name = "盘亏", width = 15)
+    @ApiModelProperty(value = "盘亏")
+    private Integer inventoryLoss;
+    /**
+     * 盘盈
+     */
+    @Excel(name = "盘盈", width = 15)
+    @ApiModelProperty(value = "盘盈")
+    private Integer inventoryGain;
+
+    /**
+     * 完成度
+     */
+    @Excel(name = "完成度", width = 15)
+    @ApiModelProperty(value = "完成度")
+    private BigDecimal completion;
+
+
+}