Bladeren bron

feat(system): 添加设备管理功能- 新增 AppDevice 实体类用于管理设备信息
- 实现设备管理的 CRUD 操作接口和控制器
- 添加设备管理相关的 Mapper 和 Service
- 更新 OrderServiceImpl,支持设备录入用户信息功能
- 修改 HikiotTool 类,增加设备添加、用户添加和人脸添加的方法

SheepHy 5 dagen geleden
bovenliggende
commit
76424670c5

+ 31 - 9
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/OrderServiceImpl.java

@@ -10,6 +10,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -48,6 +50,9 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.stream.Collectors;
 
+import static org.jeecg.modules.hikiot.HikiotTool.addFace;
+import static org.jeecg.modules.hikiot.HikiotTool.addUser;
+
 @Service
 @Log4j2
 public class OrderServiceImpl implements IOrderService {
@@ -93,6 +98,8 @@ public class OrderServiceImpl implements IOrderService {
     private AppContractSignMapper appContractSignMapper;
     @Resource
     private RedissonDelayQueue redissonDelayQueue;
+    @Resource
+    private AppDeviceMapper appDeviceMapper;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -420,7 +427,6 @@ public class OrderServiceImpl implements IOrderService {
                         String startTime = DateUtil.format(priceRule.getEndTime(), "HH:mm:ss");
                         String endTime = DateUtil.format(priceRule.getEndTime(), "HH:mm:ss");
                         String expireTime = date + " " + endTime;
-
                         AppOrderProInfo appOrderProInfo = new AppOrderProInfo();
                         appOrderProInfo
                                 .setProductId(priceRule.getId())
@@ -440,6 +446,9 @@ public class OrderServiceImpl implements IOrderService {
                                 .setDelFlag(CommonConstant.DEL_FLAG_0);
 
                         proInfoList.add(appOrderProInfo);
+//                        appDeviceMapper.selectList(Wrappers.<AppDevice>lambdaQuery().eq(AppDevice::getId,appSite.getId())).forEach(appDevice -> {
+//                            addUser(priceRule.getDateOfSale(),appDevice.getDeviceSerial(),familyMembers.getFullName(),id);
+//                        });
                     }
                 }
 
@@ -789,14 +798,29 @@ public class OrderServiceImpl implements IOrderService {
                     .setTicketNo(appOrderProInfo.getTicketNo())
                     .setIsinStatus(CommonConstant.ISIN_STATUS_1);
             appIsinMapper.insert(appIsin);
+            appDeviceMapper.selectList(Wrappers.<AppDevice>lambdaQuery().eq(AppDevice::getOrgCode,appOrder.getOrgCode())).forEach(appDevice -> {
+                try {
+                    String addUser = addUser(appSitePriceRulesMapper.selectById(appOrderProInfo.getProductId()).getDateOfSale(),
+                            appDevice.getDeviceSerial(),
+                            appOrderProInfo.getUserName(),
+                            appOrderProInfo.getId());
+                    String addFace = addFace(appDevice.getDeviceSerial(), appOrderProInfo.getId(),
+                            familyMembersMapper.selectById(appOrderProInfo.getFamilyUserId()).getRealNameImg());
+                    JsonObject addUserJson = JsonParser.parseString(addUser).getAsJsonObject();
+                    JsonObject addFaceJson = JsonParser.parseString(addFace).getAsJsonObject();
+                    if(addUserJson.get("code").getAsInt() != 0 && addFaceJson.get("code").getAsInt() != 0) throw new JeecgBootException("设备录入用户信息失败!请联系管理员");
+                }catch (Exception e){
+                    throw new JeecgBootException("设备录入用户信息失败!请联系管理员");
+                }
+            });
         }
-
-        //保存保险
-        for (InsureOrderInfo insureOrderInfo : insureOrderInfoList) {
-            insureOrderInfo.setOrderId(appOrder.getId());
-            insureOrderInfoMapper.insert(insureOrderInfo);
+        if(!insureOrderInfoList.isEmpty()) {
+            //保存保险
+            for (InsureOrderInfo insureOrderInfo : insureOrderInfoList) {
+                insureOrderInfo.setOrderId(appOrder.getId());
+                insureOrderInfoMapper.insert(insureOrderInfo);
+            }
         }
-
         //保存核销记录
         for (AppCoursesVerificationRecord appCoursesVerificationRecord : appCoursesVerificationRecordList) {
             appCoursesVerificationRecord.setOrderId(appOrder.getId());
@@ -1237,10 +1261,8 @@ public class OrderServiceImpl implements IOrderService {
                     .setPayTime(DateUtil.parse(notifyRequestForm.getTrade_time(),"yyyyMMddHHmmss"))
                     .setCallbackStatus(1);
         }
-
         NotifyResponse notifyResponse = new NotifyResponse();
         notifyResponse.setCode("SUCCESS").setMessage("执行成功");
-
         return notifyResponse;
     }
 

+ 27 - 19
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/hikiot/HikiotTool.java

@@ -17,6 +17,7 @@ import java.net.http.HttpResponse;
 import java.nio.charset.StandardCharsets;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.time.ZoneId;
 import java.util.*;
 
 import static com.alibaba.dashscope.utils.JsonUtils.gson;
@@ -160,24 +161,30 @@ public class HikiotTool {
      * @Description 新增/修改人员
      * @Date 9:35 2025/8/15
      **/
-    public static String addUser() throws IOException, InterruptedException {
+    public static String addUser(Date inputDate,String deviceSerial,String name,String employeeNo) throws IOException, InterruptedException {
+        LocalDateTime now = inputDate.toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDateTime();
+        LocalDateTime startOfDay = now.with(LocalTime.MIN); // 00:00
+        LocalDateTime endOfDay = now.with(LocalTime.MAX);
         AddUserRequestDTO addUserRequestDTO = new AddUserRequestDTO();
         List<AddUserRequestDTO.DoorRightPlan> doorRightPlans = new ArrayList<>();
         AddUserRequestDTO.DoorRightPlan doorRightPlan = new AddUserRequestDTO.DoorRightPlan();
         doorRightPlan.setDoorNo(1);
         doorRightPlan.setPlanTemplateId(Collections.singletonList(1));
         doorRightPlans.add(doorRightPlan);
-        addUserRequestDTO.setDeviceSerial("FX0889961");
+        addUserRequestDTO.setDeviceSerial(deviceSerial);
         addUserRequestDTO.setPayload(new AddUserRequestDTO.Payload()
                 .setUserInfo(new AddUserRequestDTO.UserInfo()
                         .setUserType(VISITOR)
-                        .setEmployeeNo("00wm")
-                        .setName("王明")
+                        .setEmployeeNo(employeeNo)
+                        .setName(name)
                         .setDoorRightPlan(doorRightPlans)
                         .setDoorRight(Collections.singletonList(1))
-                        .setPermanentValid(true).setMaxOpenDoorTime(255)
-                        .setEnableBeginTime(LocalDateTimeUtil.format(LocalDateTime.now().with(LocalTime.MIN), "yyyy-MM-dd'T'HH:mm:ss"))
-                        .setEnableEndTime("2025-12-31T23:59:59")));
+                        .setPermanentValid(false)
+                        .setMaxOpenDoorTime(255)
+                        .setEnableBeginTime(LocalDateTimeUtil.format(startOfDay, "yyyy-MM-dd'T'HH:mm:ss"))
+                        .setEnableEndTime(LocalDateTimeUtil.format(endOfDay, "yyyy-MM-dd'T'HH:mm:ss"))));
         return sendPostRequest(ADD_USER_URL, gson.toJson(addUserRequestDTO),setHeaders());
     }
 
@@ -186,10 +193,10 @@ public class HikiotTool {
      * @Description 设备添加
      * @Date 10:47 2025/8/15
      **/
-    public static String addDevice() throws IOException, InterruptedException {
+    public static String addDevice(String deviceSerial,String validateCode) throws IOException, InterruptedException {
         Map<String, String> device = new HashMap<>();
-        device.put("deviceSerial", "FX0889961");
-        device.put("validateCode", "zswl8812");
+        device.put("deviceSerial", deviceSerial);
+        device.put("validateCode", validateCode);
         device.put("addMethod", "DeviceToken");
         device.put("qrCode", "");
         return sendPostRequest(ADD_DEVICE_URL, gson.toJson(device),setHeaders());
@@ -235,12 +242,13 @@ public class HikiotTool {
      * @Description 新增/修改人脸
      * @Date 14:28 2025/8/15
      **/
-    public static String addFace() throws IOException, InterruptedException {
+    public static String addFace(String deviceSerial,String employeeNo,String url) throws IOException, InterruptedException {
         AddFaceRequestDTO addFaceRequestDTO = new AddFaceRequestDTO();
-        addFaceRequestDTO.setDeviceSerial("FX0889961");
+        addFaceRequestDTO.setDeviceSerial(deviceSerial);
         addFaceRequestDTO.setPayload(new AddFaceRequestDTO.Payload()
-                .setFaceInfo(new AddFaceRequestDTO.Payload.FaceInfo().setEmployeeNo("00wm")
-                        .setFaceURL("https://dst-health.oss-cn-chengdu.aliyuncs.com/20250818/0e6f578209ba4eb995a73c6130ba9836.jpg")));
+                .setFaceInfo(new AddFaceRequestDTO.Payload.FaceInfo()
+                        .setEmployeeNo(employeeNo)
+                        .setFaceURL(url)));
         return sendPostRequest(ADD_FACE_URL, gson.toJson(addFaceRequestDTO),setHeaders());
     }
 
@@ -261,11 +269,11 @@ public class HikiotTool {
      * @Description 配置人员周计划
      * @Date 16:12 2025/8/15
      **/
-    public static String addUserWeekPlan() throws IOException, InterruptedException {
+    public static String addUserWeekPlan(String deviceSerial) throws IOException, InterruptedException {
         AddUserWeekPlanDTO dto = new AddUserWeekPlanDTO();
 
         // 基础配置
-        dto.setDeviceSerial("FX0889961");
+        dto.setDeviceSerial(deviceSerial);
 
         // 初始化payload
         AddUserWeekPlanDTO.Payload payload = new AddUserWeekPlanDTO.Payload();
@@ -315,9 +323,9 @@ public class HikiotTool {
      * @Description 配置人员计划模板
      * @Date 17:09 2025/8/15
      **/
-    public static String addUserPlanTemplate() throws IOException, InterruptedException {
+    public static String addUserPlanTemplate(String deviceSerial) throws IOException, InterruptedException {
         String addUserPlanTemplate = "{\n" +
-                "    \"deviceSerial\": \"FX0889961\",\n" +
+                "    \"deviceSerial\": \"" + deviceSerial +"\",\n" +
                 "    \"payload\": {\n" +
                 "        \"userPlanTemplate\": {\n" +
                 "            \"doorPlanTemplateId\": 1,\n" +
@@ -429,7 +437,7 @@ public class HikiotTool {
     }
 
     public static void main(String[] args) throws IOException, InterruptedException {
-        addUser();
+//        addUser();
 //        addUserPlanTemplate();
 //        addFace();
 //        addUserWeekPlan();

+ 197 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/controller/AppDeviceController.java

@@ -0,0 +1,197 @@
+package org.jeecg.modules.system.app.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.system.app.entity.AppDevice;
+import org.jeecg.modules.system.app.mapper.AppSiteMapper;
+import org.jeecg.modules.system.app.service.IAppDeviceService;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+
+import static org.jeecg.modules.hikiot.HikiotTool.*;
+
+/**
+ * @Description: nm_device
+ * @Author: jeecg-boot
+ * @Date:   2025-08-19
+ * @Version: V1.0
+ */
+@Tag(name="nm_device")
+@RestController
+@RequestMapping("/com/AppDevice")
+@Slf4j
+public class AppDeviceController extends JeecgController<AppDevice, IAppDeviceService> {
+	@Resource
+	private IAppDeviceService AppDeviceService;
+	@Resource
+	private AppSiteMapper appSiteMapper;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param AppDevice
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "nm_device-分页列表查询")
+	@Operation(summary="nm_device-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<AppDevice>> queryPageList(AppDevice AppDevice,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+
+
+        QueryWrapper<AppDevice> queryWrapper = QueryGenerator.initQueryWrapper(AppDevice, req.getParameterMap());
+		Page<AppDevice> page = new Page<AppDevice>(pageNo, pageSize);
+		IPage<AppDevice> pageList = AppDeviceService.page(page, queryWrapper);
+		pageList.getRecords().forEach(item->{
+			item.setSiteName(appSiteMapper.selectById(item.getSiteId()).getName());
+		});
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   添加
+	 *
+	 * @param AppDevice
+	 * @return
+	 */
+	@AutoLog(value = "nm_device-添加")
+	@Operation(summary="nm_device-添加")
+	@RequiresPermissions("com:nm_device:add")
+	@PostMapping(value = "/add")
+	@Transactional
+	public Result<String> add(@RequestBody AppDevice AppDevice){
+		AppDeviceService.save(AppDevice);
+		try {
+			if(AppDevice.getDeviceSerial() != null && AppDevice.getValidateCode() != null){
+				String addDevice = addDevice(AppDevice.getDeviceSerial(), AppDevice.getValidateCode());
+				String userWeekPlan = addUserWeekPlan(AppDevice.getDeviceSerial());
+				String userPlanTemplate = addUserPlanTemplate(AppDevice.getDeviceSerial());
+				JsonObject deviceJson = JsonParser.parseString(addDevice).getAsJsonObject();
+				JsonObject userWeekPlanJson = JsonParser.parseString(userWeekPlan).getAsJsonObject();
+				JsonObject userPlanTemplateJson = JsonParser.parseString(userPlanTemplate).getAsJsonObject();
+				if(deviceJson.get("code").getAsInt() == 0
+						&& userWeekPlanJson.get("code").getAsInt() == 0
+						&& userPlanTemplateJson.get("code").getAsInt() == 0){
+					return Result.OK("添加成功!");
+				}else {
+					return Result.OK("添加失败!");
+				}
+			}
+		}catch (Exception e){
+			throw new JeecgBootException("添加失败!");
+		}
+		return Result.OK("添加成功!");
+	}
+	
+	/**
+	 *  编辑
+	 *
+	 * @param AppDevice
+	 * @return
+	 */
+	@AutoLog(value = "nm_device-编辑")
+	@Operation(summary="nm_device-编辑")
+	@RequiresPermissions("com:nm_device:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody AppDevice AppDevice) {
+		AppDeviceService.updateById(AppDevice);
+		return Result.OK("编辑成功!");
+	}
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "nm_device-通过id删除")
+	@Operation(summary="nm_device-通过id删除")
+	@RequiresPermissions("com:nm_device:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		AppDeviceService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "nm_device-批量删除")
+	@Operation(summary="nm_device-批量删除")
+	@RequiresPermissions("com:nm_device:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.AppDeviceService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "nm_device-通过id查询")
+	@Operation(summary="nm_device-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<AppDevice> queryById(@RequestParam(name="id",required=true) String id) {
+		AppDevice appDevice = AppDeviceService.getById(id);
+		if(appDevice==null) {
+			return Result.error("未找到对应数据");
+		}
+		appDevice.setSiteName(appSiteMapper.selectById(appDevice.getSiteId()).getName());
+		return Result.OK(appDevice);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param AppDevice
+    */
+    @RequiresPermissions("com:nm_device:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, AppDevice AppDevice) {
+        return super.exportXls(request, AppDevice, AppDevice.class, "nm_device");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("com:nm_device:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, AppDevice.class);
+    }
+
+}

+ 82 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppDevice.java

@@ -0,0 +1,82 @@
+package org.jeecg.modules.system.app.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: nm_device
+ * @Author: jeecg-boot
+ * @Date:   2025-08-19
+ * @Version: V1.0
+ */
+@Data
+@TableName("nm_device")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="nm_device")
+public class AppDevice implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键ID*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @Schema(description = "主键ID")
+    private String id;
+    @Excel(name = "部门编码", width = 15)
+    @Schema(description = "部门编码")
+    private String orgCode;
+	/**设备编号(海康序列号)*/
+	@Excel(name = "设备编号(海康序列号)", width = 15)
+    @Schema(description = "设备编号(海康序列号)")
+    private String deviceSerial;
+	/**设备类型:1、出口 2、进口*/
+	@Excel(name = "设备类型:1、出口 2、进口", width = 15)
+    @Schema(description = "设备类型:1、出口 2、进口")
+    private Integer deviceType;
+	/**设备号*/
+	@Excel(name = "设备号", width = 15)
+    @Schema(description = "设备号")
+    private Integer deviceNo;
+	/**门店ID*/
+	@Excel(name = "门店ID", width = 15)
+    @Schema(description = "门店ID")
+    private String siteId;
+    @Excel(name = "门店名称", width = 15)
+    @Schema(description = "门店名称")
+    @TableField(exist = false)
+    private String siteName;
+	/**备注*/
+	@Excel(name = "备注", width = 15)
+    @Schema(description = "备注")
+    private String remark;
+	/**创建人;创建人*/
+    @Schema(description = "创建人;创建人")
+    private String createBy;
+	/**创建时间;创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "创建时间;创建时间")
+    private Date createTime;
+	/**更新人;更新人*/
+    @Schema(description = "更新人;更新人")
+    private String updateBy;
+    @Schema(description = "设备密码")
+    private String validateCode;
+	/**更新时间;更新时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "更新时间;更新时间")
+    private Date updateTime;
+
+}

+ 14 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppDeviceMapper.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.system.app.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.system.app.entity.AppDevice;
+
+/**
+ * @Description: nm_device
+ * @Author: jeecg-boot
+ * @Date:   2025-08-19
+ * @Version: V1.0
+ */
+public interface AppDeviceMapper extends BaseMapper<AppDevice> {
+
+}

+ 5 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppDeviceMapper.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.system.app.mapper.AppDeviceMapper">
+
+</mapper>

+ 14 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppDeviceService.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.system.app.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.system.app.entity.AppDevice;
+
+/**
+ * @Description: nm_device
+ * @Author: jeecg-boot
+ * @Date:   2025-08-19
+ * @Version: V1.0
+ */
+public interface IAppDeviceService extends IService<AppDevice> {
+
+}

+ 18 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppDeviceServiceImpl.java

@@ -0,0 +1,18 @@
+package org.jeecg.modules.system.app.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.system.app.entity.AppDevice;
+import org.jeecg.modules.system.app.mapper.AppDeviceMapper;
+import org.jeecg.modules.system.app.service.IAppDeviceService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Description: nm_device
+ * @Author: jeecg-boot
+ * @Date:   2025-08-19
+ * @Version: V1.0
+ */
+@Service
+public class AppDeviceServiceImpl extends ServiceImpl<AppDeviceMapper, AppDevice> implements IAppDeviceService {
+
+}