diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/deptConfig/domain/Equipment.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/deptConfig/domain/Equipment.java index 0574923..4218eb2 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/deptConfig/domain/Equipment.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/deptConfig/domain/Equipment.java @@ -60,4 +60,10 @@ public class Equipment { * 所属公司 */ private String deptId; + + + private String maStatus; + + private String typeId; + } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/devchange/controller/MaDevInfoController.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/devchange/controller/MaDevInfoController.java index 8f31c65..75169f7 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/devchange/controller/MaDevInfoController.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/devchange/controller/MaDevInfoController.java @@ -6,9 +6,12 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.poi.excel.ExcelWriter; +import com.bonus.common.core.text.Convert; +import com.bonus.common.core.utils.ServletUtils; import com.bonus.common.core.utils.poi.ExcelUtil; import com.bonus.common.core.web.controller.BaseController; import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.common.core.web.page.TableDataInfo; import com.bonus.common.log.annotation.SysLog; import com.bonus.common.log.enums.OperaType; import com.bonus.common.security.utils.SecurityUtils; @@ -19,7 +22,9 @@ import com.bonus.material.devchange.service.MaDevInfoServiceImpl; import com.bonus.material.device.domain.vo.DevInfoPropertyVo; import com.bonus.material.device.domain.vo.DevMergeVo; import com.bonus.system.api.domain.SysUser; +import com.github.pagehelper.PageHelper; import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.web.bind.annotation.*; import org.springframework.beans.factory.annotation.Autowired; @@ -175,12 +180,35 @@ public class MaDevInfoController extends BaseController { @ApiOperation("导出设备信息Excel") @PostMapping("/export") public void export(MaDevInfo o, HttpServletResponse response) throws IOException { - // 1. 查询所有符合条件的数据(忽略分页) - List dataList = service.export(o); - com.bonus.common.core.utils.poi.ExcelUtil util = new ExcelUtil(MaDevInfoXlsx.class); - util.exportExcel(response, dataList, "装备台账"); + List exportList; + // 1. 从请求中获取分页参数(兼容前端GET/POST传参,项目通用ServletUtils工具) + Integer pageNum = Convert.toInt(ServletUtils.getParameter("pageNum")); + Integer pageSize = Convert.toInt(ServletUtils.getParameter("pageSize")); + + // 2. 核心判断:分页参数是否有效(非空+大于0),有效则启动分页 + if (ObjectUtils.isNotEmpty(pageNum) && ObjectUtils.isNotEmpty(pageSize) + && pageNum > 0 && pageSize > 0) { + startPage(); // 仅当分页参数有效时,启动分页(查询当前页) + } + + // 3. 查询数据(service层无需修改,分页插件自动判断是否分页) + List list = service.export(o); + TableDataInfo dataTable = getDataTable(list); + + // 4. 根据分页参数,获取对应导出数据 + if (ObjectUtils.isNotEmpty(pageNum) && ObjectUtils.isNotEmpty(pageSize) + && pageNum > 0 && pageSize > 0) { + // 有有效分页参数 → 导出当前页(取分页后的rows) + exportList = (List) dataTable.getRows(); + } else { + // 无分页参数/参数无效 → 导出全部(直接使用全量查询结果) + exportList = list; + } + + // 5. 项目通用Excel工具导出(保持原有逻辑) + com.bonus.common.core.utils.poi.ExcelUtil util = new ExcelUtil<>(MaDevInfoXlsx.class); + util.exportExcel(response, exportList, "装备台账"); } - } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/devchange/domain/MaDevInfoXlsx.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/devchange/domain/MaDevInfoXlsx.java index 526f25b..4cc8cbd 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/devchange/domain/MaDevInfoXlsx.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/devchange/domain/MaDevInfoXlsx.java @@ -184,8 +184,8 @@ public class MaDevInfoXlsx { /** * 资产原值(元) */ - @Excel(name = "资产原值(元)") - @ApiModelProperty(value = "资产原值(元)") + @Excel(name = "资产原值(万元)") + @ApiModelProperty(value = "资产原值(万元)") private BigDecimal originalValue; /** diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/controller/IotMachineController.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/controller/IotMachineController.java index d90f1d7..fe8be75 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/controller/IotMachineController.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/controller/IotMachineController.java @@ -4,6 +4,7 @@ import com.bonus.common.core.utils.poi.ExcelUtil; import com.bonus.common.core.web.controller.BaseController; import com.bonus.common.core.web.domain.AjaxResult; import com.bonus.common.core.web.page.TableDataInfo; +import com.bonus.material.deptConfig.domain.Equipment; import com.bonus.material.device.domain.IotDto; import com.bonus.material.device.domain.vo.IotRecordVo; import com.bonus.material.device.domain.vo.IotVo; @@ -47,6 +48,7 @@ public class IotMachineController extends BaseController { /** * 添加或者修改设备 + * * @param iotDto * @return */ @@ -62,11 +64,12 @@ public class IotMachineController extends BaseController { /** * 删除设备 + * * @param iotId * @return */ @ApiOperation(value = "删除设备") - @DeleteMapping("/deleteById/{iotId}") + @PostMapping("/deleteById/{iotId}") public AjaxResult deleteByIds(@PathVariable("iotId") Long iotId) { log.info("删除设备传参:{}", iotId); return iotMachineService.deleteById(iotId); @@ -74,6 +77,7 @@ public class IotMachineController extends BaseController { /** * 绑定设备 + * * @param iotDto * @return */ @@ -86,6 +90,7 @@ public class IotMachineController extends BaseController { /** * 解绑设备 + * * @param iotDto * @return */ @@ -98,6 +103,7 @@ public class IotMachineController extends BaseController { /** * 根据iot设备获取绑定记录(分页) + * * @param iotDto * @return */ @@ -112,6 +118,7 @@ public class IotMachineController extends BaseController { /** * 导出绑定记录 + * * @param response * @param iotDto */ @@ -153,4 +160,19 @@ public class IotMachineController extends BaseController { log.info("报警记录接口:{}", iotDto); return AjaxResult.success(); } + + @ApiOperation("报警记录") + @GetMapping("/getEquipment") + public TableDataInfo getEquipment(Equipment equipment) { + startPage(); + List list = iotMachineService.getEquipment(equipment); + return getDataTable(list); + } + + @ApiOperation(value = "订单确认--驳回") + @GetMapping("/getCategoryList") + public AjaxResult getCategoryList(String keyWord) { + return iotMachineService.getCategoryList(); + } + } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/domain/IotDto.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/domain/IotDto.java index df1f458..64e63a2 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/domain/IotDto.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/domain/IotDto.java @@ -13,37 +13,51 @@ import java.util.Date; @Data public class IotDto { - /** iot设备ID */ + /** + * iot设备ID + */ @ApiModelProperty(value = "iot设备ID") private Long id; - /** iot设备ID */ + /** + * iot设备ID + */ @ApiModelProperty(value = "iot设备ID") private Long iotId; - /** 类型id */ + /** + * 类型id + */ @ApiModelProperty(value = "类型id") private Long typeId; @ApiModelProperty(value = "被绑定机具名称") private String typeName; - /** 被绑定机具编号 */ + /** + * 被绑定机具编号 + */ @ApiModelProperty(value = "被绑定机具编号") private String maCode; - /** iot设备类型 */ + /** + * iot设备类型 + */ @ApiModelProperty(value = "iot设备类型") private String iotType; @ApiModelProperty(value = "iot设备名称") private String iotName; - /** iot设备编码 */ + /** + * iot设备编码 + */ @ApiModelProperty(value = "iot设备编码") private String iotCode; - /** iot设备状态 (0 在线, 1 下线)*/ + /** + * iot设备状态 (0 在线, 1 下线) + */ @ApiModelProperty(value = "iot设备状态 (0 在线, 1 下线)") private int iotStatus; @@ -56,32 +70,54 @@ public class IotDto { @ApiModelProperty(value = "备注") private String remark; - /** 创建人 */ + /** + * 创建人 + */ @ApiModelProperty(value = "创建人") private String createBy; - /** 创建时间 */ + /** + * 创建时间 + */ @ApiModelProperty(value = "创建时间") private Date createTime; - /** 更新人 */ + /** + * 更新人 + */ @ApiModelProperty(value = "更新人") private String updateBy; - /** 更新时间 */ + /** + * 更新时间 + */ @ApiModelProperty(value = "更新时间") private Date updateTime; - /** 绑定人 */ + /** + * 绑定人 + */ @ApiModelProperty(value = "绑定人") private String binder; - /** 解绑人 */ + /** + * 解绑人 + */ @ApiModelProperty(value = "解绑人") private String unBinder; - /** 关键字 */ + /** + * 关键字 + */ @ApiModelProperty(value = "关键字") private String keyWord; + private String maId; + + private String type; + + private String proName; + + private String maStatus; + } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/domain/vo/IotVo.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/domain/vo/IotVo.java index 63023a0..7dded3b 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/domain/vo/IotVo.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/domain/vo/IotVo.java @@ -68,4 +68,12 @@ public class IotVo { @ApiModelProperty(value = "备注") private String remark; + private String maId; + + private String type; + + private String proName; + + private String maStatus; + } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/mapper/IotMachineMapper.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/mapper/IotMachineMapper.java index 33cac48..8afb442 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/mapper/IotMachineMapper.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/mapper/IotMachineMapper.java @@ -1,11 +1,13 @@ package com.bonus.material.device.mapper; +import com.bonus.material.deptConfig.domain.Equipment; import com.bonus.material.device.domain.IotDto; import com.bonus.material.device.domain.vo.IotRecordVo; import com.bonus.material.device.domain.vo.IotVo; import org.apache.ibatis.annotations.Mapper; import java.util.List; +import java.util.Map; /** @@ -106,4 +108,8 @@ public interface IotMachineMapper { * @return */ List getInfoList(String maCode); + + List getEquipment(Equipment equipment); + + List> getCategoryList(); } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/service/IotMachineService.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/service/IotMachineService.java index 997dd9a..a7a46f7 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/service/IotMachineService.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/service/IotMachineService.java @@ -1,6 +1,7 @@ package com.bonus.material.device.service; import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.material.deptConfig.domain.Equipment; import com.bonus.material.device.domain.IotDto; import com.bonus.material.device.domain.vo.IotRecordVo; import com.bonus.material.device.domain.vo.IotVo; @@ -63,4 +64,7 @@ public interface IotMachineService { */ List getRecordList(IotDto iotDto); + List getEquipment(Equipment equipment); + + AjaxResult getCategoryList(); } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/service/impl/IotMachineServiceImpl.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/service/impl/IotMachineServiceImpl.java index 2546fae..5ecae8f 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/service/impl/IotMachineServiceImpl.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/device/service/impl/IotMachineServiceImpl.java @@ -3,6 +3,7 @@ package com.bonus.material.device.service.impl; import com.bonus.common.core.web.domain.AjaxResult; import com.bonus.common.security.utils.SecurityUtils; import com.bonus.material.common.enums.ExceptionEnum; +import com.bonus.material.deptConfig.domain.Equipment; import com.bonus.material.device.domain.IotDto; import com.bonus.material.device.domain.vo.IotRecordVo; import com.bonus.material.device.domain.vo.IotVo; @@ -14,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; +import java.util.Collections; import java.util.List; /** @@ -231,4 +233,21 @@ public class IotMachineServiceImpl implements IotMachineService { } return iotMachineMapper.getRecordList(iotDto); } + + /** + * @param equipment + * @return + */ + @Override + public List getEquipment(Equipment equipment) { + return iotMachineMapper.getEquipment(equipment); + } + + /** + * @return + */ + @Override + public AjaxResult getCategoryList() { + return AjaxResult.success(iotMachineMapper.getCategoryList()); + } } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/controller/MenuCollectController.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/controller/MenuCollectController.java new file mode 100644 index 0000000..1b78d53 --- /dev/null +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/controller/MenuCollectController.java @@ -0,0 +1,91 @@ +package com.bonus.material.menuCollect.controller; + +import com.bonus.common.core.web.controller.BaseController; +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.material.menuCollect.service.MenuCollectService; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * 菜单收藏表 控制器 + * 匹配项目原有接口风格:RestController + 固定前缀 + 注解规范 + 依赖注入方式 + */ +@RestController +@RequestMapping("/menuCollect") +public class MenuCollectController extends BaseController { + + @Resource + private MenuCollectService menuCollectService; + + /** + * 新增菜单收藏 + * + * @param menuId 菜单ID + * @return 操作结果 + */ + @ApiOperation(value = "新增菜单收藏") + @PostMapping("/add") + public AjaxResult add(@RequestParam Long menuId) { + return menuCollectService.add(menuId); + } + + /** + * 取消菜单收藏(物理删除,匹配表设计要求) + * + * @param menuId 菜单ID + * @return 操作结果 + */ + @ApiOperation(value = "取消菜单收藏") + @PostMapping("/delete") + public AjaxResult delete(@RequestParam Long menuId) { + return menuCollectService.delete(menuId); + } + + /** + * 校验用户是否已收藏某菜单(核心查询,收藏前置判断) + * + * @param menuId 菜单ID + * @return 收藏状态(true-已收藏,false-未收藏) + */ + @ApiOperation(value = "校验菜单收藏状态") + @GetMapping("/checkCollect") + public AjaxResult checkCollect(@RequestParam Long menuId) { + return menuCollectService.checkCollect(menuId); + } + + /** + * 查询用户所有收藏菜单 + * + * @return 收藏菜单列表 + */ + @ApiOperation(value = "查询用户收藏菜单列表") + @GetMapping("/listByUser") + public AjaxResult listByUser() { + return menuCollectService.listByUser(); + } + + /** + * 统计某菜单的收藏人数 + * + * @param menuId 菜单ID + * @return 收藏人数 + */ + @ApiOperation(value = "统计菜单收藏人数") + @GetMapping("/countByMenu") + public AjaxResult countByMenu(@RequestParam Long menuId) { + return menuCollectService.countByMenu(menuId); + } + + /** + * 批量取消用户所有收藏 + * + * @return 操作结果 + */ + @ApiOperation(value = "批量取消用户所有收藏") + @PostMapping("/batchDeleteByUser") + public AjaxResult batchDeleteByUser() { + return menuCollectService.batchDeleteByUser(); + } +} \ No newline at end of file diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/domain/MenuCollect.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/domain/MenuCollect.java new file mode 100644 index 0000000..1fa285c --- /dev/null +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/domain/MenuCollect.java @@ -0,0 +1,31 @@ +package com.bonus.material.menuCollect.domain; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * 菜单收藏实体类(对应表 sys_menu_collect) + * 字段与表完全一致,类型匹配 MySQL 5.x 建表语句,无冗余字段 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class MenuCollect { + private Long id; + private Long userId; + private Long menuId; + private Date collectTime; + private String menuName; + // 最终拼接后的标准路由(返回给前端) + private String fullRoutePath; + + // 新增:临时属性 - 菜单原始path(SQL查询结果,不返回前端) + private String menuPath; + // 新增:临时属性 - 菜单父级ID(SQL查询结果,不返回前端) + private Long menuParentId; + +} \ No newline at end of file diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/mapper/MenuCollectMapper.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/mapper/MenuCollectMapper.java new file mode 100644 index 0000000..ff8741f --- /dev/null +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/mapper/MenuCollectMapper.java @@ -0,0 +1,60 @@ +package com.bonus.material.menuCollect.mapper; + +import com.bonus.material.menuCollect.domain.MenuCollect; +import com.bonus.system.api.domain.SysMenu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 菜单收藏 Mapper 接口(操作 sys_menu_collect 表) + * 基于 MyBatis 注解/XML 通用规范,参数绑定使用 @Param,支持单表核心操作 + */ +public interface MenuCollectMapper { + + /** + * 新增菜单收藏(collect_time 数据库自动填充,无需传入) + * @param menuCollect 收藏实体(仅需 userId、menuId) + * @return 受影响行数 + */ + int insertMenuCollect(MenuCollect menuCollect); + + /** + * 物理删除指定收藏(用户ID+菜单ID 精准删除) + * @param userId 用户ID + * @param menuId 菜单ID + * @return 受影响行数 + */ + int deleteByUserAndMenu(@Param("userId") Long userId, @Param("menuId") Long menuId); + + /** + * 批量物理删除用户所有收藏 + * @param userId 用户ID + * @return 受影响行数 + */ + int deleteBatchByUserId(@Param("userId") Long userId); + + /** + * 校验收藏状态(查询是否存在指定用户+菜单的收藏记录) + * @param userId 用户ID + * @param menuId 菜单ID + * @return 收藏记录数(0=未收藏,1=已收藏) + */ + int checkCollect(@Param("userId") Long userId, @Param("menuId") Long menuId); + + /** + * 根据用户ID查询所有收藏菜单 + * @param userId 用户ID + * @return 收藏菜单列表(含菜单ID、收藏时间等) + */ + List selectListByUserId(@Param("userId") Long userId); + + /** + * 统计指定菜单的收藏人数 + * @param menuId 菜单ID + * @return 收藏总人数 + */ + int selectCollectCountByMenuId(@Param("menuId") Long menuId); + + List selectAllMenu(); +} \ No newline at end of file diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/service/MenuCollectService.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/service/MenuCollectService.java new file mode 100644 index 0000000..78c01bf --- /dev/null +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/service/MenuCollectService.java @@ -0,0 +1,56 @@ +package com.bonus.material.menuCollect.service; + + +import com.bonus.common.core.web.domain.AjaxResult; + +/** + * 菜单收藏 业务层接口 + */ +public interface MenuCollectService { + + /** + * 新增菜单收藏 + * + * @param menuId 菜单ID + * @return AjaxResult + */ + AjaxResult add(Long menuId); + + /** + * 取消菜单收藏(物理删除) + * + * @param menuId 菜单ID + * @return AjaxResult + */ + AjaxResult delete(Long menuId); + + /** + * 校验用户是否已收藏某菜单 + * + * @param menuId 菜单ID + * @return AjaxResult + */ + AjaxResult checkCollect(Long menuId); + + /** + * 查询用户所有收藏菜单 + * + * @return AjaxResult + */ + AjaxResult listByUser(); + + /** + * 统计菜单收藏人数 + * + * @param menuId 菜单ID + * @return AjaxResult + */ + AjaxResult countByMenu(Long menuId); + + /** + * 批量取消用户所有收藏 + * + * @return AjaxResult + */ + AjaxResult batchDeleteByUser(); +} diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/service/impl/MenuCollectServiceImpl.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/service/impl/MenuCollectServiceImpl.java new file mode 100644 index 0000000..054cbf3 --- /dev/null +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/menuCollect/service/impl/MenuCollectServiceImpl.java @@ -0,0 +1,206 @@ +package com.bonus.material.menuCollect.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.common.security.utils.SecurityUtils; +import com.bonus.material.menuCollect.domain.MenuCollect; +import com.bonus.material.menuCollect.mapper.MenuCollectMapper; +import com.bonus.material.menuCollect.service.MenuCollectService; +import com.bonus.system.api.domain.SysMenu; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 菜单收藏 Service 实现类 + * 实现业务逻辑、参数校验、异常捕获、结果封装,适配项目原有 AjaxResult 规范 + */ +@Service +public class MenuCollectServiceImpl implements MenuCollectService { + + // 与原有代码一致,使用 @Resource 依赖注入 Mapper + @Resource + private MenuCollectMapper menuCollectMapper; + + /** + * 新增菜单收藏 + */ + @Override + public AjaxResult add(Long menuId) { + // 1. 参数非空校验(基础校验,避免空指针) + Long userId = SecurityUtils.getLoginUser().getSysUser().getUserId(); + try { + MenuCollect menuCollect = new MenuCollect(); + menuCollect.setUserId(userId); + menuCollect.setMenuId(menuId); + // 3. 执行插入 + menuCollectMapper.insertMenuCollect(menuCollect); + return AjaxResult.success("收藏成功"); + } catch (DuplicateKeyException e) { + // 4. 捕获唯一索引冲突异常(重复收藏) + return AjaxResult.error("已收藏该菜单,无需重复收藏"); + } catch (Exception e) { + // 5. 通用异常捕获,保证接口健壮性 + e.printStackTrace(); + return AjaxResult.error("收藏失败,请稍后重试"); + } + } + + /** + * 取消菜单收藏(物理删除) + */ + @Override + public AjaxResult delete(Long menuId) { + // 参数非空校验 + Long userId = SecurityUtils.getLoginUser().getSysUser().getUserId(); + try { + // 执行精准删除 + int rows = menuCollectMapper.deleteByUserAndMenu(userId, menuId); + if (rows > 0) { + return AjaxResult.success("取消收藏成功"); + } else { + return AjaxResult.error("未找到该收藏记录,取消失败"); + } + } catch (Exception e) { + e.printStackTrace(); + return AjaxResult.error("取消收藏失败,请稍后重试"); + } + } + + /** + * 校验用户是否已收藏某菜单 + */ + @Override + public AjaxResult checkCollect(Long menuId) { + // 参数非空校验 + Long userId = SecurityUtils.getLoginUser().getSysUser().getUserId(); + try { + // 查询记录数(0=未收藏,1=已收藏) + int count = menuCollectMapper.checkCollect(userId, menuId); + // 返回布尔状态,方便前端判断 + return AjaxResult.success(count > 0); + } catch (Exception e) { + e.printStackTrace(); + return AjaxResult.error("校验收藏状态失败,请稍后重试"); + } + } + + @Override + public AjaxResult listByUser() { + // 1. 获取当前登录用户ID,参数校验 + Long userId = SecurityUtils.getLoginUser().getSysUser().getUserId(); + if (userId == null || userId <= 0) { + return AjaxResult.error("用户ID不合法"); + } + + try { + // 2. 基础查询:仅查收藏列表基础信息(无拼接,MyBatis无任何异常) + List collectList = menuCollectMapper.selectListByUserId(userId); + if (CollectionUtil.isEmpty(collectList)) { + return AjaxResult.success(Collections.emptyList()); // 空列表直接返回 + } + + // 3. 一次性查询所有菜单,转为Map(key=menuId,value=SysMenu),避免循环查库 + List allMenuList = menuCollectMapper.selectAllMenu(); + Map menuMap = allMenuList.stream() + .collect(Collectors.toMap(SysMenu::getMenuId, menu -> menu, (k1, k2) -> k1)); + + // 4. 核心:遍历收藏列表,Java层面拼接多级路由 + collectList.forEach(collect -> { + String fullRoute = buildMenuRoute(collect.getMenuId(), collect.getMenuPath(), menuMap); + collect.setFullRoutePath(fullRoute); // 设置最终拼接的路由 + // 清空临时属性(可选,避免返回前端多余字段) + collect.setMenuPath(null); + collect.setMenuParentId(null); + }); + + // 5. 返回结果:fullRoutePath即为标准的equipment/search/category格式 + return AjaxResult.success(collectList); + + } catch (Exception e) { + e.printStackTrace(); + return AjaxResult.error("查询收藏列表失败,请稍后重试"); + } + } + + /** + * 统计菜单收藏人数 + */ + @Override + public AjaxResult countByMenu(Long menuId) { + // 参数非空校验 + if (menuId == null) { + return AjaxResult.error("菜单ID不能为空"); + } + try { + // 统计收藏人数 + int count = menuCollectMapper.selectCollectCountByMenuId(menuId); + return AjaxResult.success(count); + } catch (Exception e) { + e.printStackTrace(); + return AjaxResult.error("统计收藏人数失败,请稍后重试"); + } + } + + /** + * 批量取消用户所有收藏 + */ + @Override + public AjaxResult batchDeleteByUser() { + Long userId = SecurityUtils.getLoginUser().getSysUser().getUserId(); + try { + // 执行批量删除 + int rows = menuCollectMapper.deleteBatchByUserId(userId); + return AjaxResult.success("批量取消收藏成功,共删除" + rows + "条记录"); + } catch (Exception e) { + e.printStackTrace(); + return AjaxResult.error("批量取消收藏失败,请稍后重试"); + } + } + + + /** + * 递归拼接菜单多级路由(核心方法) + * @param currentMenuId 当前菜单ID + * @param currentPath 当前菜单原始path + * @param menuMap 所有菜单的Map集合(key=menuId) + * @return 标准路由:equipment/search/category + */ + private String buildMenuRoute(Long currentMenuId, String currentPath, Map menuMap) { + // 1. 标准化当前path:去除首尾/,空值处理 + String standardCurrentPath = StrUtil.trim(currentPath, '/'); + if (StrUtil.isBlank(standardCurrentPath)) { + standardCurrentPath = ""; + } + + // 2. 获取当前菜单的父级ID + SysMenu currentMenu = menuMap.get(currentMenuId); + if (currentMenu == null || currentMenu.getParentId() == 0) { + // 无父级/顶级菜单(parent_id=0),直接返回当前标准化path + return standardCurrentPath; + } + + // 3. 递归查询父级菜单的路由 + SysMenu parentMenu = menuMap.get(currentMenu.getParentId()); + if (parentMenu == null) { + // 父级菜单不存在(脏数据),返回当前标准化path + return standardCurrentPath; + } + String parentRoute = buildMenuRoute(parentMenu.getMenuId(), parentMenu.getPath(), menuMap); + + // 4. 拼接父级路由和当前路由:父级/当前(如equipment/search + category → equipment/search/category) + if (StrUtil.isBlank(parentRoute)) { + return standardCurrentPath; + } + if (StrUtil.isBlank(standardCurrentPath)) { + return parentRoute; + } + return StrUtil.format("{}/{}", parentRoute, standardCurrentPath); + } +} diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/toolLedger/controller/ToolLedgerController.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/toolLedger/controller/ToolLedgerController.java index 15a7737..92da237 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/toolLedger/controller/ToolLedgerController.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/toolLedger/controller/ToolLedgerController.java @@ -1,5 +1,7 @@ package com.bonus.material.toolLedger.controller; +import com.bonus.common.core.text.Convert; +import com.bonus.common.core.utils.ServletUtils; import com.bonus.common.core.utils.poi.ExcelUtil; import com.bonus.common.core.web.controller.BaseController; import com.bonus.common.core.web.domain.AjaxResult; @@ -15,6 +17,7 @@ import com.bonus.material.toolLedger.domain.ToolLedgerEntity; import com.bonus.material.toolLedger.service.ToolLedgerService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -145,19 +148,42 @@ public class ToolLedgerController extends BaseController { } - /** * 导出 + * * @param response * @param entity */ @PostMapping("/export") @SysLog(title = "编码工具台账", businessType = OperaType.EXPORT, logType = 0, module = "编码工具台账", details = "编码工具台账") public void export(HttpServletResponse response, ToolLedgerEntity entity) { + List exportList; + // 1. 从请求中获取分页参数(兼容前端GET/POST传参,项目通用ServletUtils工具) + Integer pageNum = Convert.toInt(ServletUtils.getParameter("pageNum")); + Integer pageSize = Convert.toInt(ServletUtils.getParameter("pageSize")); + + // 2. 核心判断:分页参数是否有效(非空+大于0),有效则启动分页 + if (ObjectUtils.isNotEmpty(pageNum) && ObjectUtils.isNotEmpty(pageSize) + && pageNum > 0 && pageSize > 0) { + startPage(); // 仅当分页参数有效时,启动分页(查询当前页) + } + + // 3. 查询数据(service层无需修改,分页插件自动判断是否分页) + List list = toolLedgerService.export(entity); + TableDataInfo dataTable = getDataTable(list); + + // 4. 根据分页参数,获取对应导出数据 + if (ObjectUtils.isNotEmpty(pageNum) && ObjectUtils.isNotEmpty(pageSize) + && pageNum > 0 && pageSize > 0) { + // 有有效分页参数 → 导出当前页(取分页后的rows) + exportList = (List) dataTable.getRows(); + } else { + // 无分页参数/参数无效 → 导出全部(直接使用全量查询结果) + exportList = list; + } try { - List list = toolLedgerService.listCode(entity); ExcelUtil util = new ExcelUtil(ToolLedgerEntity.class); - util.exportExcel(response,list,"编码工具台账"); + util.exportExcel(response, exportList, "编码工具台账"); } catch (Exception e) { logger.error(e.toString(), e); } @@ -165,22 +191,47 @@ public class ToolLedgerController extends BaseController { /** * 导出 + * * @param response * @param entity */ @PostMapping("/exportAll") @SysLog(title = "工具台账", businessType = OperaType.EXPORT, logType = 0, module = "工具台账", details = "工具台账") public void export(HttpServletResponse response, ToolLedgerAllEntity entity) { + + List exportList; + // 1. 从请求中获取分页参数(兼容前端GET/POST传参,项目通用ServletUtils工具) + Integer pageNum = Convert.toInt(ServletUtils.getParameter("pageNum")); + Integer pageSize = Convert.toInt(ServletUtils.getParameter("pageSize")); + + // 2. 核心判断:分页参数是否有效(非空+大于0),有效则启动分页 + if (ObjectUtils.isNotEmpty(pageNum) && ObjectUtils.isNotEmpty(pageSize) + && pageNum > 0 && pageSize > 0) { + startPage(); // 仅当分页参数有效时,启动分页(查询当前页) + } + + // 3. 查询数据(service层无需修改,分页插件自动判断是否分页) + List list = toolLedgerService.list(entity); + TableDataInfo dataTable = getDataTable(list); + + // 4. 根据分页参数,获取对应导出数据 + if (ObjectUtils.isNotEmpty(pageNum) && ObjectUtils.isNotEmpty(pageSize) + && pageNum > 0 && pageSize > 0) { + // 有有效分页参数 → 导出当前页(取分页后的rows) + exportList = (List) dataTable.getRows(); + } else { + // 无分页参数/参数无效 → 导出全部(直接使用全量查询结果) + exportList = list; + } + exportList.stream() + .forEach(item -> { + String code = item.getManageMode(); + String name = "0".equals(code) ? "编码工具" : "1".equals(code) ? "数量工具" : "未知管理模式"; + item.setManageMode(name); + }); try { - List list = toolLedgerService.list(entity); - list.stream() - .forEach(item -> { - String code = item.getManageMode(); - String name = "0".equals(code) ? "编码工具" : "1".equals(code) ? "数量工具" : "未知管理模式"; - item.setManageMode(name); - }); ExcelUtil util = new ExcelUtil(ToolLedgerAllEntity.class); - util.exportExcel(response,list,"工具台账"); + util.exportExcel(response, exportList, "编码工具台账"); } catch (Exception e) { logger.error(e.toString(), e); } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/toolLedger/service/Impl/ToolLedgerServiceImpl.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/toolLedger/service/Impl/ToolLedgerServiceImpl.java index acb2795..71aa4b9 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/toolLedger/service/Impl/ToolLedgerServiceImpl.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/toolLedger/service/Impl/ToolLedgerServiceImpl.java @@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Collections; import java.util.List; import static com.bonus.common.biz.constant.MaterialConstants.ADMIN_ID; @@ -46,9 +47,9 @@ public class ToolLedgerServiceImpl implements ToolLedgerService { // && !deptId.equals(PROVINCE_COMPANY_DEPT_ID)) { // entity.setCompanyId(deptId); // } - if(ADMIN_ID.equals(userId)){ + if (ADMIN_ID.equals(userId)) { entity.setCompanyId(null); - }else{ + } else { entity.setCompanyId(deptId); } return mapper.list(entity); @@ -174,4 +175,21 @@ public class ToolLedgerServiceImpl implements ToolLedgerService { } return mapper.getToolByOrder(entity); } + + /** + * @param entity + * @return + */ + @Override + public List export(ToolLedgerEntity entity) { + Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId(); + Long userId = SecurityUtils.getLoginUser().getUserid(); + if (ADMIN_ID.equals(userId)) { + // 管理员可查看所有数据 + entity.setCompanyId(null); + } else { + entity.setCompanyId(deptId); + } + return mapper.listCode(entity); + } } diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/toolLedger/service/ToolLedgerService.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/toolLedger/service/ToolLedgerService.java index 2747988..a4a6e32 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/toolLedger/service/ToolLedgerService.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/toolLedger/service/ToolLedgerService.java @@ -33,4 +33,6 @@ public interface ToolLedgerService { List getToolByPro(ToolLedgerEntity entity); List getToolByOrder(ToolLedgerEntity entity); + + List export(ToolLedgerEntity entity); } diff --git a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/devchange/MaDevInfoMapper.xml b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/devchange/MaDevInfoMapper.xml index 150a09c..d5cb25b 100644 --- a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/devchange/MaDevInfoMapper.xml +++ b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/devchange/MaDevInfoMapper.xml @@ -679,7 +679,7 @@ AND mdi.change_status=#{status} - + order by mdi.create_time desc + + diff --git a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/maDeptConfig/MaDeptConfigMapper.xml b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/maDeptConfig/MaDeptConfigMapper.xml index 124b065..cb13e9e 100644 --- a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/maDeptConfig/MaDeptConfigMapper.xml +++ b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/maDeptConfig/MaDeptConfigMapper.xml @@ -464,49 +464,81 @@ + SELECT COUNT(1) + FROM sys_menu_collect + WHERE user_id = #{userId} + AND menu_id = #{menuId} + + + + + + + + + \ No newline at end of file diff --git a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/order/OrderInfoMapper.xml b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/order/OrderInfoMapper.xml index 8eb4822..0385ad6 100644 --- a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/order/OrderInfoMapper.xml +++ b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/order/OrderInfoMapper.xml @@ -585,7 +585,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SELECT DISTINCT t.equipmentName, t.devType, - -- 新增:高亮标记后的名称(关键字用{{}}包裹) REPLACE(t.equipmentName, #{keyWord}, CONCAT('{{', #{keyWord}, '}}')) AS highlightEquipmentName @@ -593,7 +592,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" t.equipmentName AS highlightEquipmentName FROM ( - -- 原SQL的第一部分:设备(5/6级节点) SELECT CASE WHEN mtv.actual_level = 5 THEN CONCAT_WS('>', mtv.proType, mtv.mainGx, mtv.childGx,mtv.devCategory,mtv.devSubcategory) @@ -606,14 +604,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" -- 原SQL的第二部分:工具(4级节点) SELECT CONCAT_WS('>', tt4.type_name,tt3.type_name, tt2.type_name, tt1.type_name) AS equipmentName, - if(tt.manage_type =0,'编码工具','数量工具') as devType - FROM tool_type tt - LEFT JOIN tool_type tt1 ON tt.parent_id = tt1.type_id + '工具' as devType + FROM tool_type tt1 LEFT JOIN tool_type tt2 ON tt1.parent_id = tt2.type_id LEFT JOIN tool_type tt3 ON tt2.parent_id = tt3.type_id LEFT JOIN tool_type tt4 ON tt3.parent_id = tt4.type_id - WHERE tt.LEVEL = 5 - AND tt.del_flag ='0' + WHERE tt1.LEVEL = 4 AND tt1.del_flag ='0' AND tt2.del_flag ='0' AND tt3.del_flag ='0' diff --git a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/toolLedger/ToolLedgerMapper.xml b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/toolLedger/ToolLedgerMapper.xml index f13a23a..c680787 100644 --- a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/toolLedger/ToolLedgerMapper.xml +++ b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/toolLedger/ToolLedgerMapper.xml @@ -95,19 +95,15 @@ AND tt2.del_flag = '0' AND tt3.del_flag = '0' AND tt4.del_flag = '0' + AND tt.manage_type = #{manageMode} AND (tt1.type_id = #{typeId} or tt2.type_id = #{typeId} or tt3.type_id = #{typeId} or tt4.type_id =#{typeId}) - - AND tt.manage_type = #{manageMode} - - - AND tl.company_id = #{propertyUnitId} + AND tl.company_id = #{propertyUnitId} - AND tl.company_id in ( select dept_id from sys_dept where dept_id= #{companyId} @@ -204,8 +200,8 @@ tl.create_time AS createTime, tl.update_time AS updateTime FROM - tool_type tt - LEFT JOIN tool_ledger tl ON tl.type_id = tt.type_id + tool_ledger tl + LEFT JOIN tool_type tt ON tl.type_id = tt.type_id LEFT JOIN sys_dept sd ON sd.dept_id = tl.company_id LEFT JOIN ma_supplier ms ON ms.supplier_id = tl.supplier_id -- 关联1级父节点(直接父节点) @@ -253,7 +249,7 @@ ) ORDER BY - tl.create_time DESC + tl.create_time DESC ,sd.dept_id DESC